2009-05-25 103 views
35

比方说,我不小心写了这个:如何阻止Javascript中的无限循环?

do { } while (true); 

...然后运行它。除了杀死你的浏览器,有没有办法阻止JavaScript执行(相当于Ctrl + Break在基本或Ctrl + C中)?

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

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

+0

出于好奇,你是否能够确定是什么导致你的浏览器不发出'慢脚本'警告? – alex 2009-05-25 04:47:26

+2

不知道! (这15个字符的限制很烦人) – nickf 2009-05-25 04:59:52

+0

这属于超级用户吗? – Chetan 2011-04-24 19:42:08

回答

15

至少在Chrome中,您可能会关闭单个选项卡而不是整个应用程序。

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

4

取决于浏览器。有些让你点击“停止”按钮来停止JavaScript执行。其他人没有。

我建议最好的方法是完全杀死浏览器或标签。

4

大多数浏览器都有一个“缓慢的脚本性能”警告,当失控的javascript花费很长时间执行时会出现。此警告对话框通常会提供杀死有问题脚本的选项。

0

最体面的浏览器确实显示“无响应的脚本”警告..​​....如果不是,我想你的最佳行动方案是找出警告没有弹出的原因。

9

裁判: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 

PS。脚本

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

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

0

我使用Chrome时发生的事情是这样的:按shift + ctrl + esc键调出windows任务管理器。然后切换到进程选项卡并滚动浏览chrome.exe进程(chrome对每个打开的选项卡都有一个进程),直到找到一个具有比oters更高的CPU使用率的进程。它往往对我来说有30%左右,而其他所有人都有0-2% 然后我就结束这个过程。 实际上,通过转到chrome中的工具> taskmanager或shift + esc以打开其过程的自定义任务管理器,也可以实现上述目标。可能更容易使用,因为它显示更多的标签信息。

27

我使用丁目版本45.0.2454.101

在右上角,在汉堡菜单,点击更多工具>任务管理器,然后从那里杀死标签。这是如果试图关闭标签失败。否则,选项卡上的简单“X”会杀死它。

0

如果你不想杀死标签页或浏览器,这是一种技术,只要满足两个条件就可以工作(Chrome允许两个浏览器和其他浏览器也可以)。

  1. 浏览器可以暂停执行代码
  2. 的浏览器,可以修改一个可变

的对象的状态是暂停代码和改变的可变值,这样它会招来一个例外。