Javascript, цикл обработки событий, setTimeout, IIFE, закрытие
Основываясь на ссылках ниже, я понимаю следующий код:
setTimeout () не блокируется и обрабатывается веб-API браузера, который помещает обратные вызовы в очередь обратных вызовов после завершения таймера. Затем цикл обработки событий ожидает освобождения стека вызовов для выполнения каждого обратного вызова по очереди. Закрытие setTimeout закрывает анонимный IIFE и имеет правильное значение индекса для каждой итерации.
for(var i = 0; i < 3; i++){
(function(index){
setTimeout(function(){
console.log(index);
}, 5000);
})(i);
console.log("loop="+i);
}
/*Output in console is
loop=0
loop=1
loop=2
//after 5 seconds
0
1
2
*/
Я ищу объяснение того, что происходит со следующим кодом в Chrome.
for (var i = 0; i < 3; i++) {
setTimeout(
function(index) {
console.log(index);
}(i), 5000
);
console.log("loop="+i);
}
/* Output in console without any delay is:
0
loop=0
1
loop=1
2
loop=2
*/
Почему 'console.log (index)' выполняется немедленно, без 5-секундной задержки?
Как веб-API выполняет setTimeout () с обратным вызовом как IIFE?
Есть ли какие-либо обратные вызовы, помещенные в очередь обратных вызовов?
Перемещает ли цикл обработки событий какие-либо обратные вызовы в стек вызовов?
Или setTimeout () игнорируется и его обратный вызов выполняется немедленно в стеке вызовов?
Рекомендации, с которыми я консультировался:
Филипп Робертс: Какого черта цикл событий в любом случае? | ЗАО на ЕС 2014
https://www.youtube.com/watch?v=8aGhZQkoFbQ
Филипп Робертс Помогите Я застрял в цикле событий 2016
https://www.youtube.com/watch?v=6MXRNXXgP_0
стек вызовов и цикл событий
https://www.youtube.com/watch?v=mk0lu9MKBto
Закрытие JavaScript внутри циклов - простой практический пример
Использовать IIFE в setTimeout в цикле, но почему?