источник jquery использует функции setTimeout
с двумя 0
и 1
в качестве второго аргумента. У меня создается впечатление, что они оба означают "выполнить функцию, как только сможете".
Это правильно? Есть ли разница между двумя?
источник jquery использует функции setTimeout
с двумя 0
и 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();
}
setTimeout
имеет минимальный тайм-аут 4 мс. Таким образом, существует разница между нет между ними.
Если текущая запущенная задача - это задача, созданная методом setTimeout(), а тайм-аут меньше 4, увеличьте время ожидания до 4.
РЕДАКТИРОВАТЬ: Как отметил Ахмад в комментариях, спецификация изменилась сейчас, поэтому ответ будет в настоящее время: "Это зависит".
Я не уверен, что данные ответы верны. Выполняя следующий код в 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
вызывает все, что реализация рассматривает как минимальное значение.
Программно и вычислительно существует разница, но это не разница, которую вы увидите при ее выполнении, поскольку это только 1ms
.
Я бы предположил, что если таймаут установлен на 1ms
, он приостанавливает это script и позволяет другим сценариям работать в то же время. И, как вы, вероятно, знаете, javascript является односторонним, так что это может быть вашей причиной прямо там.
EDIT:
Благодаря @molf, который исправил мои мысли, казалось бы, что установка его на 0ms - всего лишь трюк, чтобы заставить его работать в следующем тике цикла события.
По причинам, почему setTimeout (fn, 0) или setTimeout (fn, 1) необходимо, проверьте Почему setTimeout (fn, 0) иногда полезно?
В сущности это означает, что этот метод не очень срочно выполнять по сравнению с другими задачами браузера, такими как рендеринг страниц. Кроме того, js-код будет работать после завершения задач ожидания. Практически разумно, нет никакой разницы между использованием 0 или 1. Это просто выбор программиста. В идеале число, выбранное кодировщиками, меньше 4, что может быть связано с причиной, отмеченной Amaan.
btw, для получения базовой информации о таймерах Javascript см. http://ejohn.org/blog/how-javascript-timers-work/
Это просто пример плохой практики кода в источнике jQuery.
Это все. Нет никаких оснований одобрять 0
над 1
или наоборот.
Поднимите ошибку jQuery, исправьте/нормализуете ее, чтобы использовать тот или иной.