2

这是我的困境。

我有这段代码:

var list_of_numbers = new Array();

function AddToArray(func)
{
    // Add to the *beginning* of the array
    // essentially reversing the order

    list_of_numbers.unshift(func);
}

function DisplayNumber(num)
{
    document.write(num);
}

for(var i=0;i<5;++i)
{
   AddToArray(function() { DisplayNumber(i); });
}

for(var i=0;i<5;++i)
{
   list_of_numbers[i]();
}​

应该发生的事情是 5 个内联函数将被添加到数组中 - 每个都获取i. 然而,这不会发生。

预期输出:

43210

实际输出:

01234

4

1 回答 1

3

您有两个单独的问题,都与范围有关。

var list_of_numbers = new Array(); 
function AddToArray(func) 
{ 
    // Add to the *beginning* of the array
    // essentially reversing the order 
    list_of_numbers.unshift(func); 
} 

function DisplayNumber(num) 
{ 
    document.write(num); 
} 
for(var i=0;i<5;++i) 
{ 
    (function(i) 
     { 
         AddToArray(function(){ DisplayNumber(i); });
     })(i); 
} 

for(var j=0;j<5;++j) 
{ 
    list_of_numbers[j](); 
}​
  1. 您传递给的匿名函数AddToArray绑定到变量i,而不是当前值。为了解决这个问题,我们创建了一个新函数,并传入当前的i.

  2. JavaScript 有函数作用域,所以当你在第二个循环中重新声明i时,你仍然在修改同一个变量。因此,我们将其重命名为j.

如果只有第一个是问题,您将得到 55555,因为所有函数都将使用相同i的 ,此时 5。但是,由于您重用i了第二个索引,i因此设置为当前循环索引。

于 2010-09-04T06:19:02.713 回答