如何在闭包中引用局部变量?

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调用函数时,是否再次创建变量项?

Tri*_*ych 4

你很接近...

为什么 item 的值为“item3”?当i变为3时,for循环不是结束了吗?

是的。

如果结束,item 不应该仍然是“item2”吗?

没有。这个例子有点棘手。在循环的最后一次迭代期间,i为 2,但它引用了数组的第三个元素list,即 3。换句话说,item == 'item' + list[2] == 'item3'

还是testList调用函数时再次创建了变量item?

不,你第一次就几乎是对的。我认为您刚刚错过了item[2]值为 3 的值。