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