2014-01-10 3 views
0

поведение setTimeout немного запутанно, все прочитанные мной ресурсы указывают, что при отсутствии задержки задание добавляется до конца очереди и выполняется, когда интерпретатору ничего не остается (пустая очередь?). однако, принять следующий пример:есть разница между setTimeout (fun) и setTimeout (fun, 4)

setTimeout(function() { console.log('without delay!'); }) 
setTimeout(function() { console.log('with delay'); }, 1000); 
var start = Date.now(); 
while (Date.now() < start + 3000) {} // block for 3 seconds 
console.log('After wait'); 

в соответствии с вышеприведенной помещения, выход будет:

After wait 
with delay 
without delay 

однако, выход (проверено в хром и светлячок):

After wait 
without delay 
with delay 

(обратите внимание, что при вызове setTimeout(fn,1000), fn будет выполняться, как только переводчик будет простаивать через 1 секунду, это может быть 1 секунда, 5 с econds, или даже навсегда, если интерпретатор остается занятым.)

предыдущий пример привел меня сделать вывод, что нет никакой разницы между setTimeout(fn), setTimeout(fn,0) и setTimeout(fn,4) (4 мс является минимальная задержка в HTML5), так как функция без задержки (два готовы к исполнению)

, так что мой вопрос в том, являются ли они эквивалентными, нет? (в HTML5).

+0

setTimeout (fn) должен быть таким же, как setTimeout (fn, 0), но js НЕ является совпадающим, поэтому лучше всего сказать, что порядок, в котором функции выведены из стека – cox

+0

@cox, я знаю об этом, Я хочу знать разницу между setTimeout (fn, 0) и setTimeout (fn, 4) –

ответ

1

тайм-аут не эквивалентно 0, и 0 эквивалентно 4, в соответствии с W3 specification for timers:

http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#dom-windowtimers-settimeout:

...
4. Get the timeout, и пусть таймаут быть результатом ,
5. Если выполняемая в настоящее время задача - это задача, созданная методом setTimeout(), а тайм-аут меньше 4, увеличьте время ожидания до 4.

http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#get-the-timeout:

Когда вышеуказанные методы, чтобы получить тайм-аут, они должны выполнить следующие шаги:

  1. Пусть таймаута будет второй аргумент метода, или ноль, если аргумент опущен.

  2. Примените абстрактную операцию ToString() к таймауту и ​​дайте время ожидания. [ECMA262]

  3. Примените абстрактную операцию ToNumber() к таймауту и ​​дайте время ожидания. [ECMA262]

  4. Если тайм-аут представляет собой значение Бесконечность, значение Not-a-Number (NaN) или отрицательное значение, пусть тайм-аут будет равен нулю.

  5. Раунд тайм-аута до ближайшего целого числа, и пусть время ожидания будет результатом.

  6. Время ожидания.

0

Согласно mozilla, минимальный размер, установленный каждым браузером, если вы не назначаете задержку. Поэтому, если минимум вашего браузера составляет 4 мс, то 0 и 4 будут означать то же самое.

последовательных SetTimeout() вызывает задержку с меньшей, чем «минимальной задержкой» предел вынуждены использовать, по меньшей мере минимальную задержку.

0

Они были бы функционально эквивалентны. Если вы поместите 0 мс в SetTimeout, он все равно будет ждать 4 мс.

Обратите внимание, что интервал для SetTimeout не начнет отсчет до тех пор, пока текущий цикл выполнения не завершится. Вот почему «без задержек» печатается первыми.

1

То, что вы получите именно то, как и ожидалось.

Момент, когда браузеру нечего делать, не тогда, когда нет ожидающих ожидания, это когда он в настоящее время ничего не работает.

После того, как ваш код заблокирован на три секунды и выйдет из вашего кода, браузер может начать обработку событий и включает таймауты. Поскольку оба тайм-аута истекли, оба будут выполняться как можно скорее, но по истечении первого таймаута он будет первым в очереди событий для обработки.

Согласно Mozilla, современные браузеры все имеют минимальную задержку в 4 мс:

«4ms определяется спецификацией HTML5 и соответствует во всех браузерах выпущен в 2010 году и последующий период»

Ссылка: https://developer.mozilla.org/en-US/docs/Web/API/Window.setTimeout#Minimum.2F_maximum_delay_and_timeout_nesting

Старые браузеры могут иметь более высокую минимальную задержку, например 10 мс.

Стандарт указывает, что значение по умолчанию для параметра тайм-аута равно нулю, которое, конечно же, корректируется до минимальной задержки.

Ref: http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#get-the-timeout

Так, называя setTimeout без перерыва или с тайм-аут 0 или 4, все эквивалентны. Даже в старых браузерах все они имеют одинаковый результат, даже если минимальный тайм-аут выше.

Смежные вопросы