Как получить доступ к этой переменной во встроенной функции?
-
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
устанавливается на текущий индекс цикла.