Как получить доступ к этой переменной во встроенной функции?

StackOverflow https://stackoverflow.com/questions/3641115

Вопрос

Вот моя дилемма.

У меня есть этот раздел кода:

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