hek*_*ran 5 javascript closures loops
我正在阅读一篇文章(JavaScript Closures for Dummies),其中一个例子如下.
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( function() {alert(item + ' ' + list[i])} );
}
return result;
}
function testList() {
var fnlist = buildList([1,2,3]);
// using j only to help prevent confusion - could use i
for (var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
testList();
Run Code Online (Sandbox Code Playgroud)
调用testList时,会出现一个警告框,其中显示"item3 undefined".文章有这样的解释:
当在行上调用匿名函数时,
fnlist[j]();
它们都使用相同的单个闭包,并且它们在该闭包中使用i和item的当前值(其中我的值为3,因为循环已完成,并且item具有值'item3').
为什么item的值为'item3'?当我变成3时,for循环结束了吗?如果它结束应该不是项目仍然是'item2'?或者,当testList调用函数时,是否再次创建变量项?
你很接近...
为什么 item 的值为“item3”?当i变为3时,for循环不是结束了吗?
是的。
如果结束,item 不应该仍然是“item2”吗?
没有。这个例子有点棘手。在循环的最后一次迭代期间,i
为 2,但它引用了数组的第三个元素list
,即 3。换句话说,item == 'item' + list[2] == 'item3'
还是testList调用函数时再次创建了变量item?
不,你第一次就几乎是对的。我认为您刚刚错过了item[2]
值为 3 的值。