Я читал эту статью http://ejohn.org/blog/how-javascript-timers-work/ и как setTimeout
и setInterval
и другие задачи async, такие как кнопка click confused me маленький.
Я знаю, что JS - это однопоточная, то есть AFAIK, все функции обратного вызова (обработчики событий a.k.a.) будут поставлены в очередь и выполняться в порядке. Однако посмотрите на изображение ниже, которое я взял из статьи, связанной выше:
Каждый блок представляет некоторую работу, и - около 10 мс - таймер запускается. Я знаю, что его функция обратного вызова помещается в очередь для последующего выполнения, но как получилось, что событие может быть вызвано, пока что-то уже выполняется?
Это потому, что setTimeout()
начинает использовать отдельный поток, чтобы подсчитать время внутри и запустить его событие завершения?
Пожалуйста, обратите внимание, что я не говорю о его выполнении обратного вызова здесь; скорее, я пытаюсь понять, как setTimeout
может подсчитать время и завершить его завершение. Я знаю, что его обратный вызов будет вызван не раньше его заданных временных параметров, но может быть позже, но это связано с тем, что его обратный вызов поставлен в очередь до более позднего времени, когда среда выполнения находит какое-то время, чтобы проверить, есть ли что-нибудь для выполнения в очереди.
Как и в случае с этим вопросом, как браузеры допускают новый клик для регистрации, а - пусть говорят - цикл работает за кулисами в момент щелчка пользователя?
Если вы говорите, что браузеры поддерживают разные потоки для разных вещей, тогда мы можем называть JS в браузерах однопоточными?