Какой из них лучше выполнить window.setTimeout - PullRequest
1 голос
/ 04 марта 2010

Какой вариант лучше выполнить window.setTimeout и почему?

Вариант А:

window.setTimeout(somefunc,0);

Вариант B:

window.setTimeout(somefunc,n); //n may be any number >0

Спасибо.

Ответы [ 6 ]

2 голосов
/ 04 марта 2010

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

var color='white';
setTimeout(function(){alert(color+' from timeout')}, 0);
for(var i=0;i<100001;++i){
    if(i=100000)alert(color='green');
}
alert(color='red')
1 голос
/ 04 марта 2010

Это зависит от того, что вы хотите сделать.

setTimeout(somefunc,0) не так уж отличается от простого вызова somefunc
(но я думаю, .setTimeout(somefunc,0) сначала завершит текущий блок, а затем вызовет somefunc)

Если вам нужно дождаться отрисовки браузера и запустить somefunc после этого, используйте window.onload или jQuery's $(document).ready

1 голос
/ 04 марта 2010

Опция A просто вызовет somefunc с дополнительными затратами на ненужный вызов setTimeout (поскольку ваш второй параметр означает 0 миллисекунд задержки ). Вариант B предназначен для тех случаев, когда вы намерены задержать выполнение somefunc. Не могли бы вы уточнить, пожалуйста, или это ответ на ваш вопрос?

0 голосов
/ 22 марта 2013

Примечание. SetTimeout (fn, 0) не обязательно гарантирует, что функция fn будет вызываться сразу после развертывания текущего стека вызовов - это может быть не очень важным отличием.

Возможно, IS , что браузер может что-то добавить в событие до вашего кода setTimeout (fn, 0) [возможно, код, предшествующий setTimeout, включал в себя некоторые интенсивные вычисления ЦП]. См. Пример здесь

function clickHandler () {
    spinWait(1000);
    setTimeout(relayFunc, 0);
    //the jsFiddle link shows that relayFunc
    //will not be called after the clickHandler
    //if another event was queued during spinWait()
}

Для использования setTimeout, отличного от обычного 'let dom elements render first', см. мой блог здесь

0 голосов
/ 04 марта 2010

Я помню некоторые проблемы с браузером при использовании setTimeout (func, 0), поэтому теперь я делаю setTimeout (func, 1) всякий раз, когда я хочу иметь самую короткую задержку. Обратите внимание, что для большинства (всех?) Браузеров реальная кратчайшая задержка составляет некоторое число n > 1 (определенно n > 0 и, вероятно, n < 50).

С каким браузером у меня возникли проблемы, я не помню.

0 голосов
/ 04 марта 2010
window.setTimeout(somefunc,0);

сразу запустит somefunc (но не будет ждать возвращаемого значения, прежде чем продолжить)

window.setTimeout(somefunc,n);

будет ждать n миллисекунд перед запуском somefunc (но не будет ждать его запуска или возврата, прежде чем продолжить)

или если вы позвоните somefunc() без таймаута, он запустится somefunc, но дождитесь его завершения, прежде чем продолжить.

Рассматривайте setTimeout как "запуск" нового потока.

...