如何在内联函数中访问此变量?

时间:2010-09-04 06:09:19

标签: javascript copy inline-functions

这是我的困境。

我有这部分代码:

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

1 个答案:

答案 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](); 
}​
  1. 您传递给AddToArray的匿名函数绑定到变量i,而不是当前值。为了解决这个问题,我们创建了一个新函数,并传入了当前的i

  2. JavaScript具有函数范围,因此当您在第二个循环中重新声明i时,您仍然在修改相同的变量。因此,我们将其重命名为j

  3. 如果只有第一个是问题,那么你会得到55555,因为在那一点上所有函数都会使用相同的i。但是,由于你为第二个索引重用了i,{ {1}}设置为当前循环索引。