@xenonhammer

Как изменяется переменная в цикле события?

const button = document.getElementById('button');

	button.addEventListener('click', function (e){
		for (var i = 0; i < 3; i++){
			console.log(i);
		}
	});
button.click();

Ребят я не понимаю -> вот то что на верху при вызове события, будет в цикле изменять i. и тогда будет выводится в консоле 0 1 2. Это понятно, но если чуть чуть поменять функцию,

const button = document.getElementById('button');
for (var i = 0; i < 3; i++){
	button.addEventListener('click', function (e){
		console.log(i);
	});
}
button.click();

то я не понимаю почему выводится 3??? как она получается, объясните пожалуйста на пальцах
  • Вопрос задан
  • 180 просмотров
Решения вопроса 3
dimovich85
@dimovich85 Куратор тега JavaScript
https://u-academy.net/
Нашли кнопку, сохранили ссылку.
Запустили цикл. Появилась переменная i = 0;
На клик по кнопке повесили функцию, которая КОГДА КЛИКНУТ на кнопку возьмет переменную i и выведет в консоль.
Цикл не закончился, переменная i = 1;
На клик по кнопке повесили ЕЩЕ такую же функцию.
Цикл не закончился, переменная i = 2;
На клик по кнопке повесили ЕЩЕ такую же функцию.
Цикл продолжается, но теперь i = 3, условие цикла дает false, цикл прекратился, но i = 3.
По кнопке кликнули....
Запустилась функция номер раз: ищет переменную i, находит, а там 3 -> в консоль ее.
Запустилась функция номер два: ищет переменную i, находит, а там 3 -> в консоль ее.
Запустилась функция номер три: ищет переменную i, находит, а там 3 -> в консоль ее.
ИТОГО: в консоли три тройки.
Ответ написан
@quiplunar
Правильно, должно выводиться 3, так как при компиляции кода for выполняется 3 раза, и 3 раза добавляется на кнопку событие клика. После выполнения всех итерация i будет равна последнему значению и при клике оно показывается, так как при клике for не срабатывает, т.к он не в функции клика и выполняется при компиляции.

Так-же замените это:

const button = document.getElementById('button');

На современный способ:

const button = document.querySelector('#button');

И вот это:

button.addEventListener('click', function (e){
     console.log(i);
});


На это:

button.addEventListener('click', (event) => {
     console.log(i);
});


(ОПАСНО, менять на стрелочную функцию только при понимании того как она работает, при не уверенности не использовать данный совет)
Ответ написан
varkrift
@varkrift
Junior Frontend Developer
Это происходит потому что у тебя в начале проходит цикл до того момента пока i не становится равной 3, но при этом addEventListener не срабатывает (он работает только при клике).
А когда ты кликаешь срабатывает addEventListener где i уже равно 3
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы