Разница между setTimeout (fn, 0) и setTimeout (fn, 1)?

источник jquery использует функции setTimeout с двумя 0 и 1 в качестве второго аргумента. У меня создается впечатление, что они оба означают "выполнить функцию, как только сможете".

Это правильно? Есть ли разница между двумя?

Ответ 1

Я думаю, что ответ "Теперь это зависит".

Мы можем запускать код в разных платформах и браузерах:

function setTimeouts() {
  setTimeout(function() { console.log(2); }, 2);
  setTimeout(function() { console.log(1); }, 1);
  setTimeout(function() { console.log(0); }, 0);
}

for (var i = 0; i < 10; i++) {
  setTimeouts();
}

Ответ 2

setTimeout имеет минимальный тайм-аут 4 мс. Таким образом, существует разница между нет между ними.

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

Spec

РЕДАКТИРОВАТЬ: Как отметил Ахмад в комментариях, спецификация изменилась сейчас, поэтому ответ будет в настоящее время: "Это зависит".

Ответ 3

Я не уверен, что данные ответы верны. Выполняя следующий код в Chrome, 0 явно вызывает функцию привязки более быстро (просто переключите значения таймера между 0 и 1):

console.log("A");
console.log("B");
var start = new Date().getTime();
setTimeout(function() {
    console.log(new Date().getTime() - start);
}, 0);
console.log("C");
console.log("D");

0 похоже, делает что-то вроде NodeJS setImmediate, нажимая инструкцию в конец текущего стека вызовов, а 1 вызывает все, что реализация рассматривает как минимальное значение.

Ответ 4

Программно и вычислительно существует разница, но это не разница, которую вы увидите при ее выполнении, поскольку это только 1ms.

Я бы предположил, что если таймаут установлен на 1ms, он приостанавливает это script и позволяет другим сценариям работать в то же время. И, как вы, вероятно, знаете, javascript является односторонним, так что это может быть вашей причиной прямо там.

EDIT:

Благодаря @molf, который исправил мои мысли, казалось бы, что установка его на 0ms - всего лишь трюк, чтобы заставить его работать в следующем тике цикла события.

Ответ 5

По причинам, почему setTimeout (fn, 0) или setTimeout (fn, 1) необходимо, проверьте Почему setTimeout (fn, 0) иногда полезно?

В сущности это означает, что этот метод не очень срочно выполнять по сравнению с другими задачами браузера, такими как рендеринг страниц. Кроме того, js-код будет работать после завершения задач ожидания. Практически разумно, нет никакой разницы между использованием 0 или 1. Это просто выбор программиста. В идеале число, выбранное кодировщиками, меньше 4, что может быть связано с причиной, отмеченной Amaan.

btw, для получения базовой информации о таймерах Javascript см. http://ejohn.org/blog/how-javascript-timers-work/

Ответ 6

Это просто пример плохой практики кода в источнике jQuery.

Это все. Нет никаких оснований одобрять 0 над 1 или наоборот.

Поднимите ошибку jQuery, исправьте/нормализуете ее, чтобы использовать тот или иной.