昨天在掘金上看到一篇關于閉包基礎學習的文章javaScript閉包入門
我對閉包的理解:一個函數嵌套另一個函數,子函數返回父函數的值,使得在函數外部也可以訪問到函數內部的變量。
其中有一個梨子:
function buildList(list) { var result = []; for (var i = 0; i < list.length; i++) { var item = 'item' + i; result.push( function() {console.log(item + ' ' + list[i])} );//匿名閉包函數 } return result;}function testList() { var fnlist = buildList([1,2,3]); // 使用j是為了防止搞混---可以使用i for (var j = 0; j < fnlist.length; j++) { fnlist[j](); }} testList() //輸出 "item2 undefined" 3 次result.push( function() {console.log(item + ' ' + list[i])}這一行給result數組添加了三次函數匿名引用。如果你不熟悉匿名函數可以想象成下面代碼:pointer = function() {console.log(item + ' ' + list[i])};result.push(pointer);注意,當你運行上述代碼的時候會打印"item2 undefined"三次!和buildList的局部變量對應的閉包只有一個。當匿名函數在fnlist[j]()這一行調用的時候,他們使用同一個閉包,而且是使用的這個閉包里i和item現在的值(循環結束后i的值為3,item的值為'item2')。注意:我們從索引0開始,所以item最后的值為item2',i的值會被i++增加到3 。
新聞熱點
疑難解答