如何停止JavaScript中的无限循环?


76

假设我不小心写了这个:

 do { } while (true);

...然后运行它。除了终止浏览器之外,还有没有其他方法可以停止JavaScript执行(相当于Ctrl + Break或Ctrl + C)?

通常,大约30秒后,浏览器会询问您是否要停止长时间运行的脚本,但这并不总是会发生(正如我刚刚发现的那样)!

仅供参考:这样的简单循环for (i=1; i > 0; ++i);将导致我的浏览器崩溃(Firefox 3.5b4)。我不太想测试是否是我的附加组件。星期一晚上,不断重启浏览器并不是我的想法。


出于好奇,您是否能够确定是什么原因导致您的浏览器没有发出“慢脚本”警告?
亚历克斯

2
没有线索!(这15个字符的限制很烦人)
尼克

这是否属于SuperUser?
Chetan

3
@Chetan:这几乎完全与编程相关...
nickf

哦,我误解了这是关于浏览器使用而不是插件开发的问题。我的错。
Chetan

Answers:


23

至少使用Chrome,您也许可以杀死单个标签,而不是整个应用程序。

Randolpho还告诉我IE8具有类似的功能。


3
您能详细说明如何杀死单个标签吗?我们是否寻找合适的chrome.exe并在任务管理器中将其杀死?
mellamokb

1
否定,不起作用!至少在Linux的36.0.1985.125版本上没有
Octopus

2
它对我有效,版本为40.0.2214.115(64位),但我不得不等待几秒钟。如果包含这些详细信息,那么这个答案将是有用的,可以投票的10倍。
Michael Scheper'3

1
我发现这对我有用,但是,如果您在具有无限循环的同一选项卡中按shift + esc键,Chrome将为javascript提供一个处理keypress / keydown / keyup的机会,然后再决定是否应该执行任何操作,因为您的javascript繁忙且无法处理您实际上禁用所有镶边快捷方式的事件。
Barak Gall

在Chrome浏览器中,我打开一个新标签,然后双击x标签名称旁边的按钮。尽管我不确定为什么未注册首次点击,但这似乎可行。
Redwolf节目,

58

我正在使用Chome版本45.0.2454.101

在汉堡包菜单的右上角,单击“更多工具”>“任务管理器”,然后从此处终止该选项卡。如果尝试关闭选项卡失败。否则,选项卡上的简单“ X”会杀死它。


在打开devtools时,在Ajax回调中产生无限循环会导致普通X失败。
masterX244 '17

53

2018更新:

在Chrome 67中,如果打开了DevTools(F12),则可以结束无限循环而不会杀死整个选项卡:

  • 转到“源”面板,然后单击“暂停脚本执行”。
  • 按住相同的按钮,然后选择“停止”图标。

在此处输入图片说明

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


这对我不起作用,尽管可能包含源代码中的所有内容,但我只是找不到正确的文件。
TiggerToo

@TiggerToo-您不需要首先找到正确的文件。只需单击暂停按钮,浏览器就会在卡住的地方停止。
Sphinxxx

10

参考: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都被禁用,尽管至少可以关闭该选项卡。)普通javascriptTimeout()setInterval() 呼叫不受此影响,并且受到限制,以便在挂起时可以手动干预“优雅地”中止呼叫。

经验观察的测试环境:

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

PS。剧本

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

i超过允许的最大值时,将最终陷入溢出错误。


9

如果您使用的是Chrome,则可以轻松杀死不响应的标签页。

当您看到无限JavaScript循环发生时,请执行以下步骤:

1.如果您已经打开了另一个标签,请继续该标签或打开一个新标签

2.按“ Shift + Esc”打开Chrome的任务管理器

3.在列表中找到您的标签(列表中应该有最多的内存消耗者),然后单击“结束进程”按钮。


导航到另一个选项卡很重要,因为JavaScript会因无限循环而吸引您的按键,并且对此无能为力。


4

大多数浏览器会发出“脚本性能降低”警告,这是由于无法控制的JavaScript执行时间过长而引起的。该警告对话框通常提供杀死恶意脚本的选项。


5
-1冗余。OP:“通常,大约30秒后,浏览器会询问您是否要停止长时间运行的脚本,但这并不总是会发生(正如我刚刚发现的那样!)” 我也遇到了同样的问题,对话框并不总是显示出来。
mellamokb

请参阅stackoverflow.com/questions/905322/…,以了解“对话框未始终显示”的可能原因。
2013年

4

取决于浏览器。有些让您单击“停止”按钮以停止javascript执行。其他人没有。

我建议最好的方法是完全杀死浏览器或选项卡。


0

大多数体面的浏览器的确会显示“无响应脚本”警告。



0

我使用Chrome时发生的情况是按shift + ctrl + esc组合键以启动Windows Taskmanager。然后切换到进程选项卡,并滚动浏览chrome.exe进程(每个打开的选项卡都有一个进程),直到我发现一个进程的使用率比其他程序高得多。对我来说,它通常占30%左右,而对其他人来说,它占0-2%,那么我就结束这个过程。实际上,可以通过在chrome中转到tools> taskmanager或shift + esc打开其自定义Taskmanager进行处理来完成此操作。使用它可能会更容易,因为它显示了选项卡的更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.