再談Js閉包

2021-09-18 04:14:18 字數 1039 閱讀 8491

閉包實際上就是子作用域讀取父作用域的變數,這本來很合理也很簡單,但是關鍵點在於這個讀取是動態的,請看下面的例子:

for(var i=0 ;i<3 ;i++));

};// 輸出 3 3 3

結果並不是期望的0 1 2,因為是動態的讀取i,因此如果你在下文改變變數i也依舊會影響到輸出讀取i。

傳統的解決方案是構建閉包,是最有效也是相容性最好的方法

for(var i=0 ;i<3 ;i++));

})(i);

};// 輸出 0 1 2

這麼做是十分有效的,為每乙個閉包單獨建立乙個作用域,也是下面要說的其他解決方案的基礎。

這一段**很重要,理解這一段**基本上就可以說理解閉包了。

實際上,大多數情況我們並不是想單純是使用for迴圈,for迴圈的乙個很常見的用處是遍歷陣列。

var arr =['a' ,'b' ,'c'];

for(var i=0 ;i因為是動態讀取,所以輸出undefined很正常。可以使用上面的構建乙個自執行函式來解決,但還有乙個更方便的解決方案,也是實際開發中經常用到的。

['a' ,'b' ,'c'].foreach(function(item));

});// 輸出 a b c

利用array原生的foreach可以更好的實現,而且也符合語義,這個是花生最推薦的用法。

如果瀏覽器較新支援es5,function還提供乙個bind方法來繫結引數

for(var i=0 ;i<3 ;i++);

// 輸出 0 1 2

function.bind具體的語法與相容性可以參考mdn。

還有其他的「歪門邪道」的解決方案,比如利用閉包讀取到父作用域的集合,在集合裡尋找「自己」,或者是利用js的引用傳遞等等。

實際上,利用es5的bind方法和array的foreach就已經可以解決所有問題了,所以在實際開發中應該避免第一種構建閉包的解決方案。

說說js閉包

js閉包涉及到作用域,js的作用域有兩種,全域性變數和區域性變數,全家變數就是在函式外宣告的,區域性變數是在函式內宣告的,函式內部可以直接讀取全域性變數 但是函式外部自然無法讀取函式內的區域性變數 函式內部宣告變數的時候,要用var不然就是個全域性變數 有時候需要得到函式內的區域性變數 濫用閉包會可...

JS閉包理解

下圖例項 body ul li 1 li li 2 li li 3 li ul body html script vara document.getelementsbytagname li for vari 0 i a.length i i 如何從外部讀取區域性變數 functionvisitinn...

JS基礎 閉包

注 自由變數是既不是在本地宣告又不作為引數傳遞的一類變數。function a return b var b a b hello closure 定義乙個函式a a中定義了函式b a中返回b 執行a 把a的返回結果賦值給變數b 執行b 閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式...