Wie stoppt man eine Endlosschleife in Javascript?

Lesezeit: 6 Minuten

Benutzer-Avatar
Nickf

Nehmen wir an, ich habe versehentlich Folgendes geschrieben:

 do { } while (true);

…und dann lief es. Abgesehen davon, dass Sie Ihren Browser beenden, gibt es eine Möglichkeit, die Ausführung von Javascript zu stoppen (das Äquivalent von Strg + Break in Basic oder Strg + C)?

Normalerweise fragt Ihr Browser nach etwa 30 Sekunden, ob Sie das lange laufende Skript stoppen möchten, aber das passiert nicht immer (wie ich gerade herausgefunden habe)!

FYI: Eine einfache Schleife wie diese: for (i=1; i > 0; ++i); führt zum Absturz meines Browsers (Firefox 3.5b4). Ich habe keine große Lust zu testen, ob es eines meiner Add-Ons ist. Ständig meinen Browser neu zu starten ist nicht meine Vorstellung von einem lustigen Montagabend.

  • Konnten Sie aus Neugier feststellen, was dazu geführt hat, dass Ihr Browser keine „Slow Script“-Warnung ausgegeben hat?

    – Alex

    25. Mai 2009 um 4:47 Uhr

  • keine Ahnung! (Diese 15-Zeichen-Beschränkung ist ärgerlich)

    – Nickf

    25. Mai 2009 um 4:59 Uhr

  • Gehört das zu SuperUser?

    – Chetan

    24. April 2011 um 19:42 Uhr

  • @Chetan: Es ist so ziemlich alles programmierbezogen …

    – Nickf

    24. April 2011 um 20:03 Uhr

  • Oh, ich habe dies als Frage zur Browsernutzung missverstanden und nicht zur Plugin-Entwicklung. Mein Fehler.

    – Chetan

    24. April 2011 um 20:45 Uhr

Aktualisierung 2018:

Wenn Sie in Chrome 67 die DevTools geöffnet haben (F12), können Sie die Endlosschleife beenden, ohne den gesamten Tab zu beenden:

  • Gehen Sie zum Quellen und klicken Sie auf „Skriptausführung anhalten“.
  • Halten Sie dieselbe Taste gedrückt und wählen Sie nun das Symbol „Stop“.

Geben Sie hier die Bildbeschreibung ein

https://developers.google.com/web/updates/2018/04/devtools#stop

  • Das hat bei mir nicht funktioniert, obwohl ich möglicherweise mit all dem Zeug in den Quellen einfach nicht die richtige Datei finden kann.

    – TiggerToo

    28. Mai 2019 um 19:30 Uhr

  • @TiggerToo – Sie müssen nicht zuerst die richtige Datei finden. Klicken Sie einfach auf die Pause-Schaltfläche, und der Browser stoppt dort, wo er hängen bleibt.

    – Sphinxxx

    26. Dezember 2019 um 21:07 Uhr

  • Das funktioniert nicht. F12 reagiert nicht. Beim manuellen Öffnen von devtools wird ein „leeres“ Fenster angezeigt. Nur Pause-Taste, kein Stopp, und es tut nichts. Es ist nur möglich, den Prozess zu beenden.

    – Bryc

    18. Juli um 13:51 Uhr

Ich verwende Chome-Version 45.0.2454.101

Klicken Sie in der oberen rechten Ecke im Hamburger-Menü auf Weitere Tools > Task-Manager und beenden Sie dann die Registerkarte von dort. Dies ist der Fall, wenn der Versuch, die Registerkarte zu schließen, fehlschlägt. Andernfalls tötet es ein einfaches ‘X’ auf der Registerkarte.

  • Eine Endlosschleife in einem Ajax-Callback führt dazu, dass das einfache X fehlschlägt, wenn Sie devtools geöffnet haben.

    – masterX244

    23. Februar 2017 um 8:37 Uhr

Benutzer-Avatar
Alex

Zumindest mit Chrome können Sie möglicherweise den einzelnen Tab und nicht die gesamte Anwendung beenden.

Randolpho hat mich auch darüber informiert, dass IE8 eine ähnliche Funktionalität hat.

  • Können Sie näher erläutern, wie Sie einen einzelnen Tab töten können? Suchen wir nach der richtigen chrome.exe und beenden sie im Task-Manager?

    – mellamokb

    26. April 2011 um 1:30 Uhr

  • negativ, geht nicht! zumindest nicht auf Version 36.0.1985.125 für Linux

    – Krake

    11. Oktober 2014 um 4:56 Uhr

  • Bei mir hat es in Version 40.0.2214.115 (64-Bit) funktioniert, aber ich musste mehrere Sekunden warten. Diese Antwort wäre 10-mal so nützlich und abstimmbar, wenn sie diese Details enthalten würde.

    – Michael Scheper

    4. März 2015 um 4:24 Uhr

  • Ich fand, dass dies für mich funktionierte, aber wenn Sie Umschalt + Esc auf derselben Registerkarte drücken, auf der sich die Endlosschleife befindet, gibt Chrome Javascript die Möglichkeit, den Tastendruck / Tastendruck / Tastendruck zu verarbeiten, bevor entschieden wird, ob es etwas tun soll, da Ihr Javascript jedoch beschäftigt ist und Ereignisse nicht verarbeiten können, deaktivieren Sie tatsächlich alle Chrome-Verknüpfungen.

    – Barack Gall

    6. Juli 2016 um 22:29 Uhr

  • In Chrome öffne ich einen neuen Tab und doppelklicke auf den x Schaltfläche neben dem Registerkartennamen. Es scheint zu funktionieren, obwohl ich nicht sicher bin, warum der erste Klick nicht registriert wird.

    – Radvylf-Programme

    21. Mai 2019 um 0:49 Uhr

Benutzer-Avatar
Rahmat Ali

Wenn Sie verwenden Chrom Sie können den nicht reagierenden Tab einfach beenden:

  1. Wechseln Sie zu einem anderen Tab
  2. Drücken Sie Wechsel + Esc öffnen Task-Manager von Chrome
  3. Finden Sie Ihren Tab in der Liste (sollte der meiste Speicherverbraucher sein)
  4. Klicken Prozess beenden

Wichtig: Das Navigieren zu einem anderen Tab ist wichtig, denn wenn Sie sich auf dem ursprünglichen Tab befinden, wird JavaScript den Browser dazu bringen, Ihren Tastendruck nicht zu verarbeiten und aufgrund seiner Endlosschleife nichts zu tun.

Benutzer-Avatar
geschlungen

Referenz: https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox

Firefox ist besonders problematisch …

Warnung! Vorbehalt! Führen Sie dies NICHT aus!

javascript:
    while (true) alert("irritated and exhausted - yet?");

Dies wird “unendlich” gehen und ein internes Timeout NICHT erschöpfen, da das Skript die CPU-Zeit nicht schnell genug verbrauchen wird. In FF 11 garantiert dies, dass es keine “nicht reagierenden Skript”-Abbruchmöglichkeiten geben wird.

Das ordnungsgemäße Stoppen nur des anstößigen Skripts war in frühen Browserversionen möglich und trivial, indem manuell eingegriffen wurde, ohne den gesamten Browser zu krächzen und abzubrechen. Eine solche Kontrolle nicht zu haben, ist ein großer Konstruktionsfehler der Browser-Software. Unvernünftige Geschicklichkeit und Reflexe sind erforderlich, um die manuelle Motormechanik der in der Referenz beschriebenen “Lösungen” zu bewirken.

Vorbehalt: Es ist möglich, dass Skripte “unendlich” werden, ohne Zeitüberschreitung UND ohne Eingabeaufforderungen des Alarmtyps. Diese sind besonders schädlich und lästig. Grundsätzlich laufen die Skripte so langsam, dass die CPU-Zeitzykluszuteilung von sagen wir 20 Sekunden beträgt. über mehrere Minuten oder Stunden gestreckt wird oder … vor dem Timeout durch Aussetzen der Ausführung bis zur Wiederaufnahme durch einen Ereignisauslöser. Anstatt CPU-Zyklen zu timen, wäre es für Skripte weitaus besser, eine Zeitüberschreitung bei der realen Taktung vorzunehmen. (Ist Ihnen schon einmal aufgefallen, dass Sie ein Skript nicht abbrechen können, das versucht, Inhalte abzurufen – aber erfolglos –, um eine Seite zu erstellen? In FF werden sowohl die Adressleisten-Schaltflächen reload und cancel/stop sind deaktiviert, obwohl der Tab zumindest geschlossen werden kann.) Normales Javascript Timeout() und setInterval() Anrufe leiden nicht darunter und sind so konditioniert, dass sie während des Suspendierens durch manuelles Eingreifen “anständig” abgebrochen werden können.

Testumgebung für empirische Beobachtungen:

window.navigator.userAgent=
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0

PS. das Skript

for (i=1; i > 0; ++i);

wird schließlich bei einem Überlauffehler abgefangen i den zulässigen Höchstwert überschreitet.

Benutzer-Avatar
Sowiut

Die meisten Browser haben eine „Langsame Skriptleistung“-Warnung, die erscheint, wenn ein außer Kontrolle geratenes Javascript sehr lange braucht, um ausgeführt zu werden. Dieser Warndialog bietet normalerweise die Option, das anstößige Skript zu beenden.

Hängt vom Browser ab. Bei einigen können Sie auf die Schaltfläche “Stopp” klicken, um die Ausführung von Javascript zu stoppen. Andere nicht.

Ich schlage vor, der beste Weg ist, den Browser oder die Registerkarte einfach vollständig zu beenden.

1144060cookie-checkWie stoppt man eine Endlosschleife in Javascript?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy