昨天在掘金上看到一篇关于闭包基础学习的文章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 。
新闻热点
疑难解答