通俗地理解javascript閉包

定義

閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(一般是一個函數),於是這些變量也是該表達式的一部分。。(百度百科)安全


通俗的說:JavaScript中全部的function都是一個閉包閉包

案例解讀

  • 基本案例函數

function foo() {
    var i = 0;
    return function() {
        return ++i;
    }
}

var bar=foo();

運行結果

這裏的foo運行後返回了一個函數,這個函數擁有一個本身私有的變量i,這個變量i不會由於foo運行結束了就被銷燬。
返回的這個函數被賦值給bar,這個bar就是一個閉包,它的特徵是擁有本身的私有成員,該例子中私有成員是變量i,這個私有成員能夠是一個函數spa

  • 帶有循環的閉包3d

function foo() {
    var result = [];
    for (var i = 0; i < 10; i++) {
        result[i] = function(){return i};
    }

return result;
}

var bar = foo();

帶有循環的閉包

現象如上,緣由是循環生成了10個閉包,可是,他們的私有成員i是他們共有的,當最後一個閉包函數生成後,i的值已經等於10,而前面的閉包的i都是這個icode

  • 循環生成閉包而且擁有真正的本身iblog

function foo() {
    var result = [];
    for (var i = 0; i < 10; i++) {
        result[i] = (function(i) {
            return function() {
                return i
            }
        })(i);仔細對比這裏的區別
    }

    return result;
}

var bar = foo();

圖片描述

顯然,循環生成的每一個閉包都真正擁有的本身私有變量,解決辦法是代碼中的自執行函數包裹須要生成的閉包函數,併爲閉包函數提供一個獨立的變量,這個時候它們的i是來自包裹它們的自執行函數的參數,而不是剛纔的foo裏面的那個i,因此它們各是各的圖片

總結

閉包的用途在我看來是爲函數提供私有的變量,使得數據安全,不會污染別人的變量,別人的成員,別人的老婆。ip

每一個家庭就比如一個閉包函數,不一樣的家庭有不一樣的老婆、老公、孩子,他們的名字甚至也能夠是同樣的,而後每一個家庭是獨立的。it

相關文章
相關標籤/搜索