2017-12-01 2 views
2

Ich habe eine Funktion, die sich bei der Fertigstellung mit setTimeout() selbst aufstellt. Könnte jemand erklären, warum Chrome DevTools es so aussehen lässt, als würde es sich selbst rekursiv aufrufen? Mein Verständnis ist der Call-Stack sollte bei jedem Aufruf klar sein.Warum stört setTimeout() meine Anrufliste unter Chrome DevTools?

Nehmen Sie dieses sehr einfaches Beispiel:

<html> 
    <head> 
    <script> 
     function main() { 
     setTimeout(main, 100); // set breakpoint here 
     } 
     main(); 
    </script> 
    </head> 
    <body></body> 
</html> 

Das erste Mal, wenn der Haltepunkt sehe ich getroffen wird:

One main on stack

Nach 3 weiteren Iterationen ich sehen:

Three main's on stack

Firefox-Entwickler-Tools tun, was ich erwarte und zeigt nur eine Instanz der Funktion auf dem Stapel jedes Mal, wenn der Haltepunkt getroffen wird.

enter image description here

Gibt es irgendeine Art von subtilem Hinweis Capture unter Chrome geht, dass ich nicht bewusst bin, oder ist das nur ein DevTools UI Ding?

+1

Es ist nur Devtools UI. Sie können sehen, dass der Callstack nur 1 tief ist, aber Sie sehen, wo der aktuelle Anruf in die Warteschlange eingereiht wurde. Das ist sehr nützlich, um herauszufinden, warum eine Funktion ausgeführt wird, und den Kontext, in dem sie aufgerufen wurde –

+0

Danke @FredStark. Ich kann das Dienstprogramm sehen, aber gibt es irgendeinen Weg zu verhindern, dass die Call-Stack-Liste in Unendlichkeit wächst, während mein Programm läuft? (ohne Async-Stack-Traces auszuschalten) – rkagerer

Antwort

3

es zu verbergen - gehen zu
Devtools Einstellungen -> Einstellungen -> Debugger
Check "Disable Asynchron-Stack-Traces"
Aber ich empfehle es zu lassen wie es ist. Es ist sehr nützlich für das Debuggen.

+1

Danke. Das habe ich etwa zur gleichen Zeit herausgefunden, als du darauf geantwortet hast! Wird Ihre Antwort nach den erforderlichen weiteren 6 Minuten akzeptieren. – rkagerer

Verwandte Themen