1

我很想对此进行一些解释(取自 javascriptkit.com):

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()很简单。我尝试一步一步地遵循第一个函数,这就是我认为它会返回的内容:

项目 1 1
项目 2 2
项目 3 3

我不明白的是如何result返回item 3 undefined3 次 - 为什么未定义,为什么只有item 3

- 在我努力学习的过程中,我并不想让它发挥作用,而是要了解我缺少什么部分以及为什么它没有像我期望的那样出现。

4

2 回答 2

4

有什么问题?

for 循环中的函数有一个引用,ii在每次迭代中都会发生变化,因此当您调用循环中声明的函数时,它将使用i它的最后一个值(3)。

一个简单的闭包将保存索引值不变:

for (var i = 0; i < list.length; i++) {
    (function(index){
        var item = 'item' + list[index];  // why ?
        result.push( function() {alert(item + ' ' + list[index])} );    
    })(i);    
}

笔记:

var item = 'item' + list[index];如果您重新查找列表中的值,为什么需要?

基于问题的更新更改,

因为i具有最终值- 3 ,这使您的代码处于最终迭代中:

// i equals to 2 here
var item = 'item' + list[i]; // gives item3
result.push( function() {alert(item + ' ' + list[i])} );
// now `i` is changed to three so we don't enter the loop.

价值观:

  • item=="item3"
  • i == 3
  • list[i]== list[3]== undefined
于 2013-03-21T12:24:46.627 回答
1

重要的是要理解由返回的数组buildList包含3共享相同闭包的函数。每次更改该闭包的局部变量时 - 它都会影响共享它的所有函数。换句话说,iitemresultlist中所有函数的变量都是相同的。在循环遍历 之后list, 的值i保持等于,3并且对于 in 中的所有函数都是如此,result因为它们共享对该变量的引用。因此,您的问题的答案将是这样的:

为什么未定义?

因为list[3] === undefined

为什么item 3

因为最后一次item变量被修改是什么时候i执行2for的主体(list[2] === 3因此item === 'item 3'

于 2013-03-21T12:46:00.263 回答