我正在阅读一篇文章(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();
当 testList 被调用时,一个警告框显示“item3 undefined”。文章有这样的解释:
当匿名函数在线上被调用时,
fnlist[j]();
它们都使用相同的单个闭包,并且它们使用该闭包中 i 和 item 的当前值(其中 i 的值为 3,因为循环已完成,并且 item 具有一个值'item3')。
为什么 item 的值为“item3”?当我变成 3 时 for 循环不会结束吗?如果它结束,项目不应该仍然是'item2'吗?还是 testList 调用函数时又创建了变量项?