Это немного каверзный концепции, чтобы понять. Бросание в вещи, такие как слушатели событий, еще больше мутирует картину.
Простой способ думать об этом как будто у вас есть конвейер. У вас есть обычные функции, все равномерно распределенные между собой.
Вещи, которые являются асинхронными вещами (таймауты, срабатывающие события и т. Д.), Заполняют эти точки. Между каждым из этих обычных вызовов нет бесконечного количества места, поэтому он подходит для того, что он может от этой очереди, выполняет немного больше обычных синхронизированных функций, заполняет еще немного места асинхронным и т. Д.
аффект кажется несколько многопоточным (и действительно, вы можете вызвать гоночные условия сорта с асинхронными вызовами). Во многих случаях различие не имеет значения. Однако важно помнить об этом.
Однако, когда вы пытаетесь отлаживать вещи, особенно при использовании таких инструментов, как: console.log
, Chrome может выглядеть так, как будто вещи скремблируются, потому что сам console.log является асинхронным (если он был синхронным, он бы заморозил ваш скрипт на длительной функции).
Вы можете увидеть это сами, если вы выводите что-то вроде этого:
var input = document.createElement('input');
input.setAttribute('value', 0);
function inc() {
input.setAttribute('value', parseInt(input.getAttribute('value'))+1);
console.log(input);
if (parseInt(input.getAttribute('value')) < 100) {
setTimeout(inc, 10);
}
}
inc();
JSFiddle: http://jsfiddle.net/c2PnP/
Что делает этот сценарий создает входной элемент, а затем через каждые 10 миллисекунд, она увеличивает значение ввод, затем выводит входной элемент. Он повторяется 100 раз (до значения = 100).
Если вы посмотрите на свою консоль, вы заметите, что некоторые из значений будут дублированы, это не будет гладкой прогрессией. Например, в прогоне я только что сделал, я вижу 5 входов со значением «100» и пробелы для недостающих чисел. Это связано с тем, что console.log работает асинхронно и выводит только тогда, когда возникает разрыв.
(Примечание. Если у вас супер быстрый компьютер, вам может потребоваться уменьшить время на меньшее, например 1, и/или увеличить количество итераций до большего числа).
'console.log' является асинхронным, по крайней мере, через IE, Firefox, Chrome. Подробнее: http://stackoverflow.com/questions/4057440/is-chromes-javascript-console-lazy-about-evaluating-arrays. Асинхронность не предполагает многопоточность. – Noseratio