这是我的困境。

我有这一段代码:

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

有帮助吗?

解决方案

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

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 设置为当前循环索引。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top