Ответ 1
Я не могу найти документацию на данный момент, но я не удивлюсь, если значение таймера должно было бы соответствовать 32-разрядному значению целого числа.
У меня проблемы с Firefox 15 и Chrome 21 со следующим кодом:
setInterval(function () { console.log('test') }, 300000000000)
В обоих браузерах функция запускается сразу же, повторяет очень быстро. Конечно, это большое число (примерно через 10 лет), но я бы не ожидал, что это будет рассматриваться как крошечное или отрицательное число. Я не видел максимально допустимую задержку в любой документации. Кто-нибудь знает, есть ли стандартный макс, или если это просто браузеры смешные?
Я не могу найти документацию на данный момент, но я не удивлюсь, если значение таймера должно было бы соответствовать 32-разрядному значению целого числа.
Интервал хранится в 32-битном int int (в тестируемой реализации: V8 в Google Chrome), поэтому поведение, которое вы видите, является результатом переполнения интервала до отрицательного числа (в этом случае оно ведет себя как если бы интервал был 0
). Таким образом, максимальный интервал, который вы можете использовать, - 2**31 - 1
.
Вот как я определил, что это так:
setInterval(function(){console.log("hi");}, Math.pow(2,31));
Ведёт себя как интервал 0
.
setInterval(function(){console.log("hi");}, Math.pow(2,31) - 1);
Не срабатывает в то время, когда я был готов ждать.
setInterval(function(){console.log("hi");}, Math.pow(2,33) + 1000);
Ведет себя как интервал 1000
(одна секунда). Здесь 2**33
не влияет на первые 32 бита, поэтому мы получаем только 1000
.
Максимально возможный интервал 2**31-1ms
немного застенчив 25 дней, поэтому более чем достаточно для чего-то разумного.
Я думаю, что максимальная задержка составляет 2 31 -1, что составляет 2 147 483 647 мс. Максимальное значение подписанного 32-битного целого числа в мс. Если бы это было без знака, это было бы 2 32 -1 = 4 294 967 295.
Макс 2,147,483,647
(2 31 -1)
Будьте осторожны, если вы сделаете число больше, чем это, оно запустится немедленно (изображение, на которое вы положили отрицательное значение, поэтому браузер будет работать бесконечно)
setInterval(()=>console.log('n'),2147483647)
31
setInterval(()=>console.log('y'),2147483648)
38
(1588) y