如何在内联函数中访问该变量?
-
30-09-2019 - |
题
这是我的困境。
我有这一段代码:
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]();
}
您传递给的匿名函数
AddToArray
绑定到变量i
, ,不是当前值。为了解决这个问题,我们创建一个新函数,并传入当前的i
.JavaScript 有函数作用域,所以当你重新声明时
i
在第二个循环中,您仍在修改相同的变量。因此,我们将其重命名为j
.
如果只有第一个是问题,您将得到 55555,因为所有函数都将使用相同的 i
, ,此时 5。但是,由于您重复使用 i
对于第二个索引, i
设置为当前循环索引。
不隶属于 StackOverflow