2013-11-24 3 views
1

Когда я поставил следующую функцию в голове моего документа:SetTimeout не запускается мгновенно

(function(){ 
    var d = new Date().getTime(); 
    console.log(new Date().getTime() - d); 

    window.setTimeout(function(){ 
     console.log(new Date().getTime() - d) 
    }, 1); 

    window.setTimeout(function(){ 
     console.log(new Date().getTime() - d) 
    }, 10); 

    window.setTimeout(function(){ 
     console.log(new Date().getTime() - d) 
    }, 100); 

    window.setTimeout(function(){ 
     console.log(new Date().getTime() - d) 
    }, 1000); 
}()); 

У меня есть эти журналы:

0 
401 
401 
402 
1397 

Там, кажется, задержка 400мс до того запускается setTimeout. Зачем ?

+0

возможно дубликат [Javascript SetTimeout не позволяет интервал при 100 мс] (http://stackoverflow.com/questions/8889239/javascript-settimeout-doesnt-allow-interval-under-100-milliseconds) –

+0

В каком браузере? И все браузеры имеют одинаковые результаты? – zzlalani

+0

Работает как и ожидалось для меня: http://jsfiddle.net/bfQRy/ вы можете испытать 1 и 15 мс из-за минимальных интервалов в зависимости от браузера – megawac

ответ

3

Javascript не является многопоточным - setTimeout не запускается мгновенно. Все, что происходит, когда вы вызываете setTimeout, помещает эту функцию в очередь, которая будет выполняться, когда текущий стек выполнения отключается. В вашем случае для достижения этой цели требуется около 400 мс.

См. How Timers Work за хорошее руководство по этому вопросу. В частности, эта цитата актуальна:

Для того, чтобы понять, как работают таймеры внутри, существует одна важная концепция, которую необходимо изучить: задержка таймера не гарантируется. Так как все JavaScript в браузере выполняется в одном потоке, асинхронные события (такие как щелчки мыши и таймеры) выполняются только при открытии в процессе выполнения.

+0

Он не должен принимать 400 мс, чтобы добраться до этой точки (особенно с тестом 1000 мс). В старых браузерах ожидается, что они будут принимать 15 мс и более новые браузеры 4 мс – megawac

+1

[Минимальная/максимальная задержка и тайм-аут] (https://developer.mozilla.org/en/docs/Web/API/window.setTimeout#Minimum.2F_maximum_delay_and_timeout_nesting). –

+0

Хорошо поймите, что это происходит не из-за минимального интервала времени, а в то время, когда движок должен выполнить оставшиеся инструкции в стеке. – Tibos

Смежные вопросы