从匿名函数数组返回索引位置

时间:2014-07-24 16:30:07

标签: javascript

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

1 个答案:

答案 0 :(得分:-1)

这是人们使用闭包的典型错误。 这是一个修复:

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

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