簡體   English   中英

如何停止 Javascript 中的無限循環?

[英]How do you stop an infinite loop in Javascript?

假設我不小心寫了這個:

 do { } while (true);

...然后運行它。 除了殺死你的瀏覽器,有沒有辦法停止 javascript 的執行(相當於基本的 Ctrl+Break 或 Ctrl+C)?

通常,大約 30 秒后,您的瀏覽器會詢問您是否要停止長時間運行的腳本,但這並不總是發生(正如我剛剛發現的那樣)!

僅供參考:一個簡單的循環,例如: for (i=1; i > 0; ++i); 將導致我的瀏覽器崩潰(Firefox 3.5b4)。 我不太想測試它是否是我的任何附加組件。 連續重啟我的瀏覽器並不是我認為的一個有趣的星期一晚上。

我正在使用 Chome 版本 45.0.2454.101

在右上角的漢堡菜單中,單擊“更多工具”>“任務管理器”,然后從那里取消選項卡。 這是如果嘗試關閉選項卡失敗。 否則選項卡上的一個簡單的“X”就會殺死它。

2018年更新:

在 Chrome 67 中,如果您打開了 DevTools ( F12 ),您可以結束無限循環而不殺死整個選項卡:

  • 轉到“源”面板並單擊“暫停腳本執行”。
  • 按住相同的按鈕,現在選擇“停止”圖標。

在此處輸入圖片說明

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

至少在 Chrome 中,您可以關閉單個選項卡而不是整個應用程序。

Randolpho還告訴我 IE8 具有類似的功能。

參考: https : //superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox
Firefox 尤其有問題...

警告! 警告! 不要運行這個!

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

這將“無限”並且不會耗盡內部超時,因為腳本不會足夠快地消耗 CPU 時間。 在 FF 11 中,這保證了不會有“無響應腳本”中止的機會。

在早期的瀏覽器版本中,使用手動干預優雅地停止有問題的腳本是可能的和微不足道的,而不會發出嘶嘶聲和中止整個瀏覽器。 沒有這樣的控制是一個主要的瀏覽器軟件設計缺陷。 需要不合理的靈巧和反應能力來影響參考文獻中描述的“解決方案”的手動運動機制。

警告:腳本有可能在沒有超時和沒有警報類型提示的情況下“無限”運行。 這些是特別有害和煩人的。 基本上,腳本運行得足夠慢,以至於 CPU 時間周期分配為 20 秒。 被延長了幾分鍾或幾小時,或者……,在超時之前,通過暫停執行等待事件觸發器的恢復。 代替定時 CPU 周期,腳本在現實世界的時鍾上超時會好得多。 (有沒有注意到您如何無法中止嘗試檢索內容但未成功的腳本來構建頁面?在 FF 中,地址欄按鈕reloadcancel/stop都被禁用,盡管該選項卡至少可以關閉。)普通 javascript Timeout()setInterval()調用不受此影響,並且是有條件的,因此在暫停時,手動干預可以“優雅地”中止它們。

經驗觀察的測試環境:

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

附注。 劇本

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

i超過允許的最大值時,最終會陷入溢出錯誤。

如果您使用的是 Chrome,您可以輕松殺死無響應標簽。

當您看到 JavaScript 無限循環發生時,請執行以下步驟:

1.如果您已經打開了另一個標簽,請繼續該標簽或打開一個新標簽

2.按“Shift + Esc”打開Chrome的任務管理器

3.在列表中找到您的選項卡(應該是列表中內存消耗最多的),然后單擊“結束進程”按鈕。


導航到另一個選項卡很重要,因為 JavaScript 會捕獲您的按鍵操作,並且由於其無限循環而不會對此執行任何操作。

取決於瀏覽器。 有些讓您單擊“停止”按鈕來停止 javascript 執行。 其他人沒有。

我建議最好的方法是完全殺死瀏覽器或標簽。

大多數瀏覽器都有一個“腳本性能緩慢”警告,當一個失控的 javascript 需要很長時間來執行時,就會出現這個警告。 此警告對話框通常提供終止違規腳本的選項。

在火狐瀏覽器中

轉到Developer Tools > Debugger ,然后單擊暫停按鈕。

在此處輸入圖片說明

在 Chrome 中

轉到Developer Tools > Sources ,然后單擊暫停按鈕。

在此處輸入圖片說明

來自https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox#comment93927_92617匿名

這不是一個令人滿意的通用解決方案,但是使用 Greasmonkey(或者 Ubiquity 或 Jetpack),您可以使用調用 window.confirm 的函數覆蓋 window.alert 並可選地拋出錯誤,停止所有腳本執行,或者切換標志以停止警報。 如果您不斷返回的站點呈現此行為,這可能很有用。

我在使用 Chrome 時所做的事情是按 shift+ctrl+esc 調出 Windows 任務管理器。 然后切換到進程選項卡並滾動瀏覽 chrome.exe 進程(chrome 每個打開的選項卡都有一個進程),直到我找到一個 CPU 使用率明顯高於其他進程的進程。 對我來說,它往往有大約 30%,而所有其他人都有 0-2% 然后我就結束這個過程。 實際上,同樣可以通過在 Chrome 中轉到工具>任務管理器或 shift+esc 來為其進程打開其自定義任務管理器來完成。 使用它可能更容易,因為它顯示了更多的選項卡信息。

最后的手段:從操作系統關閉瀏覽器。 在運行無限循環時,我從 Windows 10 的任務欄中關閉 Chrome 取得了很好的效果。 如果那不起作用,我會如上所述在任務管理器中殺死瀏覽器。 當然,在其他操作系統上,確切的技術會有所不同。 無限遞歸不是問題。 我見過的所有系統都會限制執行堆棧的大小,並且一旦無限遞歸導致堆棧溢出(沒有雙關語),最終會以運行時錯誤中斷。

大多數體面的瀏覽器確實會顯示“無響應腳本”警告..​​....如果沒有,我想你最好的做法是找出警告沒有彈出的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM