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

Return index position from array of anonymous functions

本文关键字:索引 位置 数组 函数 返回      更新时间:2023-09-26

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

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

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

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

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