【发布时间】:2009-06-01 02:15:24
【问题描述】:
我正在阅读一篇文章(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'?当 i 变为 3 时,for 循环不会结束吗?如果结束,项目不应该仍然是“项目2”吗?还是testList调用函数时再次创建了变量项?
【问题讨论】:
-
是否是导致文本超出预期链接的错误?
标签: javascript loops closures