Является ли setTimeout без задержки таким же, как мгновенное выполнение функции?

Я смотрю на некоторый существующий код в веб-приложении. Я видел это:

window.setTimeout(function () { ... })

Это то же самое, что просто выполнить содержимое функции сразу?

4 ответа

Решение

Он не обязательно запустится сразу, равно как и не будет явно устанавливать задержку равной 0. Причина в том, что setTimeout удаляет функцию из очереди выполнения и будет вызываться только после того, как JavaScript завершит работу с текущей очередью выполнения.

console.log(1);
setTimeout(function() {console.log(2)});
console.log(3);
console.log(4);
console.log(5);
//console logs 1,3,4,5,2

для получения более подробной информации смотрите http://javascriptweblog.wordpress.com/2010/06/28/understanding-javascript-timers/

Существует минимальная задержка, которая setTimeout использует (4 мс согласно HTML5, Firefox 3.6 использует 10 мс). Об этом есть обсуждение на странице документации Центра разработчиков Mozilla.

Короткий ответ: нет, это не то же самое.

Описание параметра в документации MDN setTimeout :

Время в миллисекундах, в течение которого таймер должен ждать перед выполнением указанной функции или кода. Если этот параметр опущен, используется значение 0, что означает выполнение «немедленно» или, точнее, следующий цикл событий. Обратите внимание, что в любом случае фактическая задержка может быть больше, чем предполагалось; см. Причины задержек дольше, чем указано ниже.

Опуская delayили с использованием значения будет выполняться в следующем цикле событий, однако это может занять больше времени. Это первая причина, по которой он отличается от немедленного выполнения содержимого функции. Например:

(Адаптировано из примера на MDN).

Обратите внимание, как задержка (или близка к 0), пока уровень вложенности не достигнет определенной точки.

Также важно отметить, что setTimeout вызывается с помощью функции-оболочки ( function () { ... }), что означает, что значение для this будет таким же, как если бы содержимое функции было выполнено сразу.


Chrome (версия 92.0.4515.131) и Firefox (версия 91.0) предписывают минимальный тайм-аут в 4 миллисекунды, когда уровень вложенности равен 4, как показано в примере выше.

В стандарте HTML сказано: «Если уровень вложенности больше 5, а тайм-аут меньше 4, тогда установите таймаут на 4».

Я считаю, что эти браузеры слишком рано выполняют задачи с минимальным таймаутом 2. Он должен применяться к планированию 7-й задачи, где уровень вложенности равен 6 (больше 5).

В конце концов, браузер может использовать какой-то другой период времени, определяемый реализацией, если захочет, так что это интересный, но спорный вопрос.

Вам не хватает параметра миллисекунды...

setTimeout(function() { /*something*/ }, 0);

0 устанавливает задержку равной 0, но на самом деле она позволяет вашей функции "переходить в очередь" из списка выполнения браузера. В браузере есть куча вещей, таких как рендеринг объектов на странице, и, вызвав это, ваша функция запустится, как только браузер выполнит несколько циклов.

Другие вопросы по тегам