你如何在Javascript中停止无限循环?

nic*_*ckf 64 javascript

假设我不小心写了这个:

 do { } while (true);
Run Code Online (Sandbox Code Playgroud)

......然后跑了.除了杀死你的浏览器,有没有办法停止javascript执行(相当于基本的Ctrl + Break,或Ctrl + C)?

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

仅供参考:这样的简单循环:for (i=1; i > 0; ++i);会导致我的浏览器崩溃(Firefox 3.5b4).我感觉不太像测试它是否是我的任何附加组件.连续重启我的浏览器不是我周一晚上的一个有趣的想法.

小智 49

我正在使用Chome版本45.0.2454.101

在右上角的汉堡菜单中,单击更多工具>任务管理器,然后从那里删除选项卡.这是因为尝试关闭选项卡失败.否则,选项卡上的简单"X"会将其杀死.


Sph*_*xxx 34

2018年更新:

在Chrome 67中,如果你有DevTools open(F12),你可以在不杀死整个标签的情况下结束无限循环:

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

在此输入图像描述

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


ale*_*lex 21

至少在Chrome上,你可以杀掉单个标签而不是整个应用程序.

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

  • 按Shift + Esc (18认同)
  • 你能详细说明如何杀死一个标签吗?我们是否在任务管理器中寻找正确的chrome.exe并将其杀死? (3认同)
  • 它适用于我,版本40.0.2214.115(64位),但我不得不等待几秒钟.如果包含这些细节,这个答案将是10倍有用,并且可以投票. (2认同)

Rah*_*Ali 10

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

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

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

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

3.在列表中找到您的选项卡(应该是列表中内存消耗最大的),然后单击“结束进程”按钮。


导航到另一个选项卡很重要,因为 JavaScript 会捕获您的按键操作,并且由于其无限循环而不会对此执行任何操作。


小智 9

参考:https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox
Firefox特别有问题......

警告!警告!不要跑这个!

javascript:
    while (true) alert("irritated and exhausted - yet?");
Run Code Online (Sandbox Code Playgroud)

这将是"无限"并且不会耗尽内部超时,因为脚本不会足够快地咀嚼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
Run Code Online (Sandbox Code Playgroud)

PS.剧本

for (i=1; i > 0; ++i);
Run Code Online (Sandbox Code Playgroud)

i超过允许的最大值时,最终将捕获溢出错误.