Задать вопрос
@nevro
не пойми кто

В for(var i = 0; i < 5; i++) функция должна писать в массив i, а пишет сразу 5. Почему?

Пример из какой-то статьи.
var myAlerts= [];

for(var i = 0: i < 5; i++)
     myAlerts.push( function inner() { alert(i); } )

myAlerts[0](); //5
myAlerts[1](); //5
myAlerts[2](); //5
myAlerts[3](); //5
myAlerts[4](); //5


Не пойму, почему так. Каждая итерация должна записываться в массив, а записывается только последняя, будто сначала прощёлкивается i, а затем только записывается.
  • Вопрос задан
  • 1453 просмотра
Подписаться 2 Оценить 14 комментариев
Пригласить эксперта
Ответы на вопрос 2
@iShatokhin
JS developer
Это основы основ JS.

Вы пушите функции, которые позже используют переменную "i", а не примитив. Изучайте замыкания и области видимости.

P.S. Через несколько лет можно будет использовать let (ES6), чтобы избежать такое.
Ответ написан
Комментировать
@nevro Автор вопроса
не пойми кто
Что-то с тостером произошло: были ответы, а сейчас - пропали...

Переписал пример:

a = 2;
function ch(){
    alert("вызов именованной функции = " + a);
};
a = 3;
ch(); //3

и
a = 2;
ch = function(){
    alert("вызов анонимной функции = " + a);
};
a = 3;
ch(); //3


Либо я не корректно пример с именованной функцией переписал, либо получается, что разницы между работой
именованных и анонимных функций - нет. То есть выполняются тогда, когда их вызывают, а "интерпретатор сохраняет в памяти именованные функции" - значит что-то другое.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы