1

我试图理解 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]();
}

此代码将打印 3 次“item3 undefined”警报。我确实理解第 5 行的 item 变量中的“3”,但我不明白为什么它会从第 5 行的 list[i] 中打印出“undefined”?这不是也使用闭包来访问列表变量吗?有人可以解释一下吗?

4

2 回答 2

1

您确实可以访问所有这些变量。问题是您在以下循环中的 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] 的第 4 个元素(您提供的数组),这是未定义的。

于 2012-10-07T10:39:59.760 回答
0

最快的解释是:闭包是围绕函数而不是语句创建的!

试试这个以了解它的含义:

function createClosure(item, val) {
    return function() {alert(item + ' ' + val)};
}

function buildList(list) {
 var result = [];
  for (var i = 0; i < list.length; i++) {
    var item = 'item' + list[i];
    result.push( createClosure(item, list[i]) );
  }
  return result;
}
于 2012-10-07T11:06:38.807 回答