一道簡單閉包面試題的詳解

題目:寫一個閉包,每調用一次+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,而這個過程就是一個閉包了。

如果不理解的話,可以記住一句話:只要變量沒有被回收,那麼這就是一個閉包。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章