Чтобы ответить на вопрос, setTimeout()
является примером использования очереди сообщений . Микрозадачи - это все, что происходит после запуска каждой функции и до того, как включается очередь сообщений. Очередь микрозадач - это действительно очередь заданий es6 , но с тех пор как v8
ей было присвоено новое имя.
Только потому, что задачи берут под 4ms
, это не делает его микрозадачей. У меня есть пример, когда второй образец взял 5ms
:
Причиной интересной тенденции, которую вы обнаружили, является, скорее всего, оптимизация Chrome. Первые несколько вызовов выполняются практически мгновенно, и, поскольку стек вызовов увеличивается, он копает глубже, чтобы захватить больше оперативной памяти.
if (c < 50) {
setTimeout(foo, 10);
c++;
}
Если вы попробуете приведенный выше фрагмент кода, вы заметите, что временные метки гораздо более последовательны. Это связано с тем, что стек вызовов добавляется с более регулярным интервалом.