Непредсказуемое поведение Google Chrome в функции alert()

Как вы видите, функция блокировки вроде alert() выводит свой вывод не в порядке, когда заполняется очередь событий в Google Chrome с помощью setTimeout() на основе этого кода.

for (var i = 1; i <= 6; i++) {

 (function(index){ 

     setTimeout(function() { alert(index) }, 100);

 })(i);

}
  • Почему это?
  • Является ли это ошибкой Google Chrome?

Для этого должно быть объяснение.

Ответ 1

В целом, разумно ожидать, что в любой момент (скажем, в миллисекундной точности) будет только один слот исполнения, и любые события (например, обратные вызовы setTimeout), которые должны произойти в этот момент, должны быть все в одной очереди. Это, кажется, ожидание ОП здесь.

Однако нет ничего, что требовало бы, чтобы браузеры работали таким образом, и реальность того, как все будет планироваться, намного сложнее, а также зависит от браузера.

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

У меня есть заархивированный пост в блоге об особенностях таймеров и моих (похожих) разочарованиях с ними: https://web.archive.org/web/20151029223348/http://blog.getify.com/on-the-nature-of-timers p >