JavaScript небольшой вопрос по циклу

LH
На сайте с 26.09.2013
Offline
89
524

Когда использую 1 вариант цикла, то создается дополнительный индекс.

Во 2 варианте все хорошо.

Я не пойму момент с анонимной функцией, когда в конце ставится (i). Можете объяснить для чего это делается, как это работает, и что это за прием?

1) ===================================

for (var i = 0; i < el.length; i++) {

el.addEventListener('change', function(){
resetErrors(i);
}, false);
}
2) ===================================
for (var i = 0; i < el.length; i++) {
(function(i) {
el.addEventListener('change', function(){
resetErrors(i);
}, false);
} (i) );
}
===================================

M
На сайте с 04.10.2011
Offline
90
#1
Leonid H:
анонимной функцией, когда в конце ставится (i). Можете объяснить для чего это делается,

Если не ошибаюсь - это передается параметр в самовызываемую функцию

Сдается, обращаться скайп avdesk-it-kmm Верстка, кодинг - контакты в профиле... VPS от 5€ (https://gmhost.com.ua/?partner=10255)
CP
На сайте с 12.08.2009
Offline
101
#2

Цикл быстрей отработает чем первый addEventListener выполниться. На тот момент когда отработает первый addEventListener переменная i может в себе содержать последний элемент массива или вообще undefined.

А так можно сказать вы замороживаете переменную i для каждого выполнения addEventListener.

Профессиональный frontend: JS, html,css, Single-Page App (/ru/forum/964386)
doctorpc
На сайте с 12.07.2009
Offline
112
#3
Content-pro:
Цикл быстрей отработает чем первый addEventListener выполниться. На тот момент когда отработает первый addEventListener переменная i может в себе содержать последний элемент массива или вообще undefined.
А так можно сказать вы замороживаете переменную i для каждого выполнения addEventListener.

Если я вас правильно понял, то в результате выполнения этого кода


for (var i = 0; i < 20; i++) {
console.log('outside: '+i);
(function(i) {
for (var j = 0; j < 1000000000; j++) {
}
console.log('inside: '+i);
}(i));
}

должно сначала 20 раз вывестить console.log('outside: '+i);

А потом уже выполняться console.log('inside: '+i);

Но во время моего тестирования они чередуются

CP
На сайте с 12.08.2009
Offline
101
#4

Потому что событий нет асинхронных. По сути это анонимная функция, ее можно так записать и вызвать


let item = function(){
console.log('it is function ');
}
item();

а можно вот так:


(function (){
console.log('it is function ');
})();

Первые () - это функция, вторые () мы ее вызываем.

Можно параметр переедать при вызове во вторых кнопках и использовать в анонимной функции:


let parameter = 'параметр';
(function (parameter){
console.log('it is function width: '); // выдаст 'it is function width: параметр'
})(parameter);

Вот и вашем втором примере вы передаете в параметр необходимый i в функцию.

К примеру пошла первая итерация цикла i=0

addEventListener - функция асинхронная, когда сработаем вызывается коллбек и первый вызов занимает 50 милисекунд.

Что бы цикл завершился нужно 2 милисекунды.

В итоге в первом примере когда у вас сработает и исполниться первый вызов addEventListener - цикл уже отработает и i не будет равен 0, может уже будет равен 50 или вообще undefined. Тогда как второй пример замыкает i в анонимную функцию и передаст корректный i даже если цикл уже отработается и если даже i вообще не будет существовать.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий