снова setTimeout против setInterval - PullRequest
3 голосов
/ 26 октября 2011

Итак, я знаю, что есть различия между setTimeout и setInterval, но рассмотрим два следующих примера кода:

function myFunction(){
   setTimeout('myFunction();', 100);
   doSomething();
}
setTimeout('myFunction();', 100);

и

function myFunction(){
   doSomething();
}
setInterval('myFunction();', 100);

Обратите внимание, что в первомНапример, я вызываю setTimeout в начале функции, а затем я doSomething.Поэтому нет дополнительной задержки от doSomething().Означает ли это, что эти два примера делают то же самое?Или есть еще более тонкая разница?

Ответы [ 2 ]

11 голосов
/ 26 октября 2011

Они функционально примерно одинаковы, но есть различия.Одно из различий заключается в том, как браузеры справляются с этим, если doSomething занимает больше времени, чем интервал.С setInterval, по крайней мере, некоторые браузеры будут просто пропускать следующий интервал, если doSomething все еще работает.Поэтому, если вы используете 100 мс, как у вас, а doSomething требует 110 мс для запуска, следующий прогон не произойдет до 90 мс позже (конечно, все эти времена приблизительны).

Другое отличиечто с setTimeout вы будете каждый раз получать новый дескриптор, тогда как с setInterval вы получаете один дескриптор.

Другое отличие от приведенных вами примеров состоит в том, что в примере setTimeout вывы запускаете парсер / компилятор JavaScript каждый раз , тогда как с setInterval вы запускаете парсер / компилятор только один раз.Но это различие не должно иметь значения, потому что вы вообще не должны этого делать - см. Ниже.

Но кроме тонкостей, то, что у вас есть, функционально одинаково.


Примечание : Не рекомендуется передавать строки в setTimeout или setInterval.Вместо этого передайте ссылку на функцию:

// setTimeout
function myFunction(){
   setTimeout(myFunction, 100);
   doSomething();
}
setTimeout(myFunction, 100);

// setInterval
function myFunction(){
   doSomething();
}
setInterval(myFunction, 100);

Передача строки запускает синтаксический анализатор JavaScript и делает то же самое, что и eval.Этого следует избегать всякий раз, когда это возможно (и это почти всегда возможно).

1 голос
/ 26 октября 2011

T.J. Краудер объяснил основные различия, может появиться еще одно более тонкое (я изменяю шкалу времени, поскольку это легче объяснить):

Позволяет отобразить разницу с очень большим временем ожидания: 1 день. Вы вызываете оба метода в 00:00 в первый день и позволяете им работать в течение 1 года ...

1 Через год ваш метод, вызванный setInterval, будет выполняться в 00:00 + несколько миллисекунд (потому что вы, возможно, не единственный, кто запрашивает процессоры в данный момент, а таймеры ОС все равно имеют гранулярность).

Но ваш метод setTimeout будет происходить позднее, возможно, около 00:01, потому что каждый день его вызывали немного позже запрошенного времени и запрашивали вызов на следующий день в то же время ...

PS: В некоторых случаях он также может вызываться до запрошенного времени, но чаще всего он запускается после: -D

...