Так работает цикл обработки событий в javascript.Обратные вызовы setTimeout () добавляются в очередь задач макроса.Очередь макрозадач обрабатывается только тогда, когда ни один другой JavaScript не выполняется в середине, или когда стек вызовов пуст.Таким образом, обратные вызовы setTimeout()
не могут выполняться до тех пор, пока цикл while (и код, который он содержит) не завершится и не вернет управление обратно в браузер.
Так в примере 1:
var bar = function() {
setTimeout(function() {
console.log("1");
}, 0);
};
var count = 4;
while(count > 0){
bar();
count --;
}
Выполнение while завершается и возвращает управление обратно в браузер (callstack пуст), поэтому все обратные вызовы setTimeout()
выполняются один за другим.
, а в example2:
var bar = function() {
setTimeout(function() {
console.log("1");
}, 1000);
};
while (true) {
bar();
}
itявляется бесконечным циклом, поэтому управление никогда не возвращается в браузер или стек вызовов никогда не бывает пустым, поэтому цикл обработки событий не может обработать очередь макросов, поэтому обратные вызовы setTimeout()
никогда не выполняются.