淺談JavaScript閉包

  初學JavaScript閉包時,閉包這個概念在我眼裏及其的神祕,也不知道這個東西在講什麼,尤爲某些地方的閉包概念定義的很是抽象,屬於那種原本你可能明白這個概念,看了反而又把你給繞糊塗了,學習了這麼長時間的JavaScript,看了很多的書,對閉包的這個概念也算是稍稍有點體會的了,這裏順便推薦兩本書《你不知道的JavaScript》和《JavaScript忍者祕籍》。
  以前有次面試的時候,面試官讓我寫一個閉包的例子,我就寫了下面的代碼:javascript

var a = 100;
(function(){
    console.log(a); //100
})();

上面這個例子從廣義上講確實算是一個閉包的例子,可是實質上講其實算是一個詞法做用域的例子,其中涉及到RHS。但卻不是一個很合適的講述閉包的例子,後面看到一個例子算是一個比較好解釋閉包的代碼:java

function fn(){
    var a = 100;
    function func(){
        console.log(a);
    }
    return func;
}

var func = fn();
func(); //100

  這個例子纔算是一個比較好的閉包的概念。面試

當函數能夠記住並訪問所在的詞法做用域時,就產生了閉包,即便函數是在當前的詞法做用域以外的執行的。閉包

  上面這個概念是引伸自《你所不知道的JavaScript》中,變量a定義在函數fn()的做用域中,而且函數fn()中含有一個內部函數func(),內部函數func()持有對變量a的引用。在正常狀況下,當函數func執行後就,內部的變量就會被垃圾回收機制所回收(好比變量a)。可是函數fn()返回了內部函數func(),內部函數func()會隨時訪問變量a,因此垃圾回收機制是不會回收函數fn()的內部做用域的,這就是閉包的含義。也就是函數

函數在定義的詞法做用域之外的地方被調用,閉包使得函數能夠繼續訪問定義時的詞法做用域。學習

  如今你對閉包的理解會不會有種恍然大悟的感受呢?若是沒有?那建議看看《你所不知道的JavaScript》和《JavaScript忍者祕籍》這兩本書,裏面對閉包講解的都很是的棒。code

相關文章
相關標籤/搜索