这是我的困境。
我有这部分代码:
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
答案 0 :(得分: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]();
}
您传递给AddToArray
的匿名函数绑定到变量i
,而不是当前值。为了解决这个问题,我们创建了一个新函数,并传入了当前的i
。
JavaScript具有函数范围,因此当您在第二个循环中重新声明i
时,您仍然在修改相同的变量。因此,我们将其重命名为j
。
如果只有第一个是问题,那么你会得到55555,因为在那一点上所有函数都会使用相同的i
。但是,由于你为第二个索引重用了i
,{ {1}}设置为当前循环索引。