Безопасно ли передавать setInterval или setTimeout с небольшой задержкой? - PullRequest
5 голосов
/ 12 декабря 2011

Я знаю, что в настоящее время разница будет незначительной из-за неточных таймеров браузера, но ради сведения, если ничего больше: есть ли браузер, который поддерживает setInterval и setTimeout, но требует, чтобы они передавали целочисленное значение в качестве задержки

Или, перефразируя с примерами, это:

setInterval(animate,50/3);

как кросс-браузер совместим, как это?

setInterval(animate,17);

Ответы [ 4 ]

7 голосов
/ 12 декабря 2011

Это совершенно безопасно.

(Как указывает РобГ, я не предоставил ссылку на сами правила моста DOM / JS, и он настаивает на осторожности. Я полагаю, что FWIW - но я не имею ни малейшего упоминания о том, что ToInteger является частью моста интерфейса. Вот jsfiddle , показывающий время ожидания, передаваемое в виде строки, числа с плавающей точкой и интеграла (того же типа, что и числа с плавающей точкой в ​​JS), который отлично работает в FF8 и IE9. Обратная связь приветствуется.)

Это потому, что интерфейс DOM принимает только целые числа для задержки в setTimeout/setInterval - да, они определены в DOM, а не в ECMAScript. Значение задержки сначала соответствующим образом преобразуется в целое значение (и в этом аспекте вызывается функция [JS-internal] ToInteger , которая выполняет усечение *).

Тем не менее, номера примеров на самом деле дадут слегка отличающиеся результаты (хотя это может быть незаметно): -)

Это потому, что 50/3 (16.66andsomemore -> 16) и 17 указывают разные таймауты .

Удачного кодирования.


*ToInteger определяется как sign(number) * floor(abs(number)), исключая особые случаи. См. Раздел 9.4 спецификации ECMAScript 5-го издания.

3 голосов
/ 12 декабря 2011

Javascript не проводит никаких различий между числами с плавающей запятой и целыми числами и является одним и тем же типом данных. 1 и 1.0 - бит для идентичных битов в памяти.

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

Но не ожидайте, что оно будет точным! Время 0.1, 1 или даже 4.87, вероятно, сработает очень близко к одному и тому же времени из-за низкой зернистости планирования обратного вызова.

0 голосов
/ 12 декабря 2011

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

Firefox не заботится о десятичных значениях. Вы можете протестировать в любых других браузерах, которые вам интересны.

0 голосов
/ 12 декабря 2011

Я бы предположил, что второй параметр будет оцениваться как выражение и до тех пор, пока он возвращает число, он будет работать.Вроде работает в хроме.Просто убедитесь, что вы не делите на ноль!

...