Посмотрите на два фрагмента кода JS
for (var i = 1; i <= 5; i++) {
setTimeout(function(){
console.log(i);
}, 0);
}
Результат: Выход 5 6
var start = new Date;
setTimeout(function(){
var end = new Date;
console.log('Time elapsed:', end - start, 'ms');
}, 500);
while (new Date - start < 1000) {};
Результаты: Время, прошедшее 1020ms (разные машины имеют разные значения, но будет немного больше, чем 1000)
Причина, почему приведенные выше результаты, в результате SetTimeout выполняется асинхронно, Js специфический асинхронный механизм, как показано ниже:
Асинхронное выполнение является наиболее важной характеристикой JavaScript, он работает: JS исполнение двигатель только один основная логика выполнения коды нити, встречает код задачи должен быть выполнен асинхронно, добавляются очередь событий. Когда основной поток находится в режиме ожидания, опрашивает задача очереди событий может быть выполнена, прикрепить его к основному потоку выполнения, и так далее, пока событие не очереди неисполняемых задач.
JS двигатель только выполнение в коде асинхронной очереди событий, но источники информации в очереди событий не двигатель JS, но браузер в других потоках, как показано ниже:
передача Http к потоку в качестве примера:
Наиболее распространенный являются вопросами JS кода Ajax запрос, то , что передается в браузере HTTP поток для обработки, и когда возвращаемые данные фоновых, HTTP нити , чтобы создать хорошие данные готовы в очереди событий событие, выполнение JS в ожидании главного потока находится в режиме ожидания.
Другим примером является наш общий щелчок, события мыши, событийной GUI поток генерируется. Когда пользователь нажимает на странице, GUI поток будет генерировать событие инициирует событие щелчка в очереди событий, ожидая , чтобы быть выполнена , когда основной поток JS вхолостую.