昨天在掘金上看到一篇关于闭包基础学习的文章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 。