У вас есть две отдельные проблемы, обе связаны с областью действия.
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
устанавливается на индекс текущего цикла.