閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(一般是一個函數),於是這些變量也是該表達式的一部分。。(百度百科)安全
通俗的說: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
都是這個i
code
循環生成閉包而且擁有真正的本身i
blog
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