Как получить доступ к этой переменной во встроенной функции? - PullRequest
2 голосов
/ 04 сентября 2010

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

У меня есть этот фрагмент кода:

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 Ответ

3 голосов
/ 04 сентября 2010

У вас есть две отдельные проблемы, обе связаны с областью действия.

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 устанавливается на индекс текущего цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...