題目:寫一個閉包,每調用一次+1。
這個問題涉及到鏈式作用域、內存、回收機制等知識點
首頁要說一下閉包是什麼:閉包就是能夠讀取其他函數內部變量的函數,個人理解:如果一個變量沒有被回收,那麼從創建該變量到調用該變量的這個過程,就是一個閉包。
先上代碼:
function Pack(){
let i = 0;
return function(){
return i++;
}
}
let pack = Pack();
console.log(pack());//0
console.log(pack());//1
console.log(pack());//2
1、匿名函數嵌套在函數Pack內部;
2、函數Pack返回匿名函數。
這樣在執行完let pack = Pack();後,變量pack實際上是指向了匿名函數,再執行pack( )後就會返回i的值(第一次爲1)。
這段代碼其實就創建了一個閉包,這是因爲函數Pack外的變量pack引用了函數Pack內的匿名函數。
也就是說,當函數Pack的內部函數被函數Pack外的一個變量引用的時候,就創建了一個閉包。
i變量爲何會自增?
這裏要說到內存和js的回收機制了,在js中定義每個變量都會自動給其分配內存,並且在結束調用該變量後,或者說在該變量的作用域中沒有可執行的代碼後,該變量就會被回收,內存釋放。
而i變量顯然沒有被釋放,因爲i被Pack函數的內部函數引用,而這個內部函數被變量pack引用,全局變量不會被回收,因爲系統不確定全局變量是否還有作用,所以pack沒有被回收,從而i變量也不會被回收。 所以執行一次pack函數,就會使i變量在原有的基礎上+1,而這個過程就是一個閉包了。
如果不理解的話,可以記住一句話:只要變量沒有被回收,那麼這就是一個閉包。