JS閉包詳解

2022-02-21 13:59:15 字數 1020 閱讀 3882

1.先看看常見的例子吧:

var fn=null;

function foo()

fn=innerfoo; 

foo();

bar();

下面我們通過斷點除錯的方法來看看執行順序:

fn=null——>foo()——>foo()內部 a=2——>fn=innerfoo()——>bar()——>bar()內部 fn()——>innerfoo() 內部console.log(a)——>結束

ps:按照常理foo()執行完畢之後,其執行環境生命週期會結束,但是通過fn=innerfoo,函式innerfoo的引用被保留了下來,複製給了全域性變數fn,所以導致了foo的變數物件也被保留了下來。所以函式fn在bar內部執行時,依然可以訪問被保留下來的變數物件。依然能夠訪問a的值

我們就稱foo為閉包

2.閉包的應用場景:

延遲函式settimeout();

下面我們看乙個例子:

function fn()

var timer=settimeout(fn,3000);

console.log(timer);

在控制台先輸出timer的值為1,然後3秒後輸出this is test。

我們先獲取到timer值,代表settimeout函式已經執行完畢,為什麼3s後我們還是執行了函式fn()呢?

這是因為settimeout通過特殊的方式,保留了fn的引用,讓settimeout的變數物件,並沒有在其執行完畢後被垃圾收集器**。因此settimeout執行結束後3秒,我們仍然能夠執行fn函式。

3.常見面試題:

利用閉包,修改下面的**,讓迴圈輸出的結果依次為1, 2, 3, 4, 5

for(var i=1;i<=5;i++),i*1000);

}思考:這段**會輸出什麼呢?

我們又該如何修改呢?

答案在這:

詳解js閉包

閉包 closure 是j ascript語言的乙個難點,也是它的特色,很多高階應用都要依靠閉包實現。閉包有三個特性 1.函式巢狀函式 2.函式內部可以引用外部的引數和變數 3.引數和變數不會被垃圾 機制 閉包是指有權訪問另乙個函式作用域中的變數的函式,建立閉包的最常見的方式就是在乙個函式內建立另乙...

詳解JS閉包概念

閉包理解 1.如何產生閉包?當乙個巢狀的內部 子 函式引用了巢狀的外部 父 函式的變數 函式 時,產生閉包 2.閉包到底是什麼?使用 chrome 除錯檢視 理解一 閉包是巢狀的內部函式 絕大部分人 理解二 包含被引用變數 函式 的物件 極少數人 注意 閉包存在於巢狀的內部函式中 3.產生閉包的條件...

js 閉包的用法詳解

實現可重用的區域性變數,且保護其不受汙染的機制。外層函式包裹受保護的變數和內層函式。內層函式專門負責操作外層函式的區域性變數。將內層函式返回到外層函式外部,反覆呼叫。子函式會一級一級地向上尋找所有父函式的變數。所以,父函式的所有變數,對子函式都是可見的,反之則不成立。外層函式呼叫了幾次,就有幾個受保...