Является ли 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, но на самом деле она позволяет вашей функции "переходить в очередь" из списка выполнения браузера. В браузере есть куча вещей, таких как рендеринг объектов на странице, и, вызвав это, ваша функция запустится, как только браузер выполнит несколько циклов.