2016-04-28 5 views
0
var timeout = setTimeout(function(){ 
    console.log("I'm message from timeout"); 
},0); 

console.log("I'm message from outside timeout"); 

//1. I'm message from outside timeout 
//2. I'm message from timeout 

Warum werden die inneren Anweisungen nicht ausgeführt, obwohl setTimeout time auf 0 gesetzt ist? Ich benutze verschiedene Zeiten einschließlich 0/null und ich frage mich, wie man sowohl setTimeout-Objekt beibehalten und seine Anweisungen mit dem Fluss ausführen.Warum wird setTimeout (.., 0) nicht sofort ausgeführt?

+3

setTimeout * immer * wird bis zur * nächsten * "Ausführungszeit" von JavaScript zurückgestellt. Ein Wert von 0/null ändert dies nicht (und wird in modernen Browsern als Wert von 5 behandelt). – user2864740

+3

Ich schrieb eine lange Antwort hier: http://stackoverflow.com/questions/32580940/cleartimeout-necessary-after-settimeout-with-0ms/32591948#32591948 und es gibt wahrscheinlich viele andere verwandte Fragen – user2864740

+0

http: // stackoverflow. com/questions/9647215/Was-ist-Minimum-Millisekunde-Wert-von-Settimeout? Lq = 1 – user2864740

Antwort

1

Javascript-Code läuft nur auf einem Thread. setTimeout plant eine Funktion, die später ausgeführt wird. In js, wenn alle aktuell laufenden Programme ihre Ausführung beenden, wird event loop nach jedem anderen Ereignis suchen. So wird setTimeout(.. 0) Code nach der aktuellen Schleife ausgeführt werden.

console.log("I'm message from outside timeout"); wird zuerst für die Ausführung geplant. Sobald es fertig ist, wird die setTimeout ausgeführt werden

So unteren Zeile setTimeout(myfunction ,0) wird meine Funktion 0ms nach der derzeit ausgeführten Funktion ausführen. & in Ihrem Fall die aktuelle Ausführungsschleife ist

console.log("I'm message from outside timeout"); 

Wenn Sie einen anderen console.log hinzufügen („Ich bin Nachricht von außen TIMEOUT1“); so aktuelle Ereignisschleife wird zuerst

I'm message from outside timeout 
I'm message from outside timeout1 

lügt vor setTimeout Funktion zu starten.

HINWEISsetTimeout hat eine minimale Zeitüberschreitung von 4 ms. Sie können sich diese Saackoverflow thread ansehen, um mehr darüber zu erfahren

+1

Die Art, wie Sie erklären Die Reihenfolge ist verwirrend. 'setTimeout' selbst wird vor der' console.log' ausgeführt, nur die Funktion, die * an * übergeben wurde. –

+2

Bezüglich "* ... minimaler Timeout von 4ms *" ist das nicht unbedingt richtig. Die aktuelle [* WHATWG spec *] (https://html.spec.whatwg.org/multipage/webappapis.html#timers) sagt "* ... nach fünf solchen verschachtelten Timern ist das Intervall jedoch gezwungen, mindestens vier zu sein Millisekunden * ". Die minimale Verzögerung ist also unabhängig von der Implementierung. – RobG