我正在尝试理解 javascript 闭包。我读了一个示例代码:
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;
}
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]();
}
此代码将打印“item3 undefined”警报 3 次。我确实理解第 5 行 item 变量中的“3”,但我不明白为什么它会从第 5 行的 list[i] 中打印出“undefined”?这不也是使用闭包来访问列表变量吗?有人能解释一下吗?
最佳答案
您确实可以访问所有这些变量。问题是您的 i 变量在以下循环中:
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( function() {alert(item + ' ' + list[i])} );
}
i 通过引用传递,并且每次循环都会增加。因此,在将闭包插入循环 3 次之后,i 的值为 4,并且每个回调都会尝试警告 [1,2,3] (您提供的数组)的第四个元素,该元素是未定义的。
关于Javascript 闭包解释与代码示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12767953/