【问题标题】:Return index position from array of anonymous functions [duplicate]从匿名函数数组返回索引位置[重复]
【发布时间】:2014-09-16 08:04:24
【问题描述】:

我试图弄清楚为什么这些匿名函数会返回循环迭代器的最后一个值,而不是迭代器设置时的当前值。我认为值可以免于通过引用传递,但看起来这些返回值是指向原始 i 的指针?

function myFunctions(n) {

  var list = [];
  for (var i = 0; i < n; i++) {    
    list.push(function(){
        return i;
    });    
  }
  return list;
}

var res = [];

myFunctions(4).map(function(el){
    res.push(el());
});

var p = document.createElement('p');
p.innerHTML = res.join(',');
document.body.appendChild(p);

//expected result: 0,1,2,3

阅读材料: Javascript by reference vs. by value

小提琴: http://jsfiddle.net/ZP2hM/

【问题讨论】:

  • 我认为在你调用任何函数时变量i它的值是4。
  • 谢谢,不知道是关闭问题,没找到上面的答案。

标签: javascript


【解决方案1】:

这是人们使用闭包时常犯的错误。 这是一个修复:

for (var i = 0; i < n; i++) {  
    var tmp = i;  
    list.push(function(){
        return tmp;
    });    
  }

这是因为列表数组中的所有函数都绑定到当前 i 值。当你的循环结束时 i = n-1;这就是为什么所有数组元素都得到 n-1 的原因。这是由每个列表元素唯一的临时变量解决的。

【讨论】:

  • 如果您运行代码,您会发现这并不能解决问题。你刚刚给i 起了一个不同的名字。所有函数都引用同一个tmp 变量。
  • 是的,这是不正确的。我认为上面建议的答案正确地描述了如何将其包装在闭包中并捕获值。
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多