В настоящее время я изучаю JavaScript и понимаю, что setTimeout отправляет вызов функции через API браузера в очередь (после истечения времени ожидания), после чего цикл обработки событий помещает функцию обратно в стек, как только стек очищено. Если я правильно понимаю, относительный порядок очереди будет зависеть от продолжительности таймаутов обратных вызовов, а также от продолжительности любых промежуточных функций.
В приведенном ниже коде
setTimeout(function(){ console.log("Hello"); }, 3000);
foo(); \\Some function of finite duration
setTimeout(function(){ console.log("World"); }, 3000);
Я ожидаю, что распечатка будет -
Hello
World
- независимо от продолжительности foo ().
И для приведенного ниже кода с неравным временем ожидания
setTimeout(function(){ console.log("Hello"); }, 5000);
foo(); \\Some function of finite duration
setTimeout(function(){ console.log("World"); }, 3000);
Я считаю, что консоль может отображать либо -
Hello
World
- или -
World
Hello
- в зависимости от продолжительности foo ()
Итак, мой настоящий вопрос заключается в следующем: если мой обратный вызов все равно будет ждать, пока стек не очистится, и я хочу убедиться, что мой скрипт работает максимально эффективно, почему бы мне просто не использовать
setTimeout(function(){bar();},0);
для большинства моих обратных вызовов? Я могу избежать повторного заказа обратных вызовов в очереди, и они будут работать как можно скорее после очистки стека. Есть ли какая-то польза от вызова некоторого короткого конечного ненулевого времени ожидания, например, 5 мс?