如何在浏览器中中断JS

How do you interrupt JS in browser?

本文关键字:中断 JS 浏览器      更新时间:2023-09-26

对于Chrome和Firefox来说,在控制台中按下Ctrl+C的等价物是什么?在实现各种算法时,我经常在Javascript中编写一些bug(while)循环,它不会退出,会使浏览器冻结。重新加载不起作用,点击小X关闭标签也没有任何作用,过了一段时间(实际上)我就没有内存了,系统正在交换,我要去喝咖啡休息。

在Chrome中,您可以点击Shift+ESC(或右键单击标题栏并打开Chrome任务管理器)并终止与挂起的选项卡相关的进程。在无法关闭选项卡的情况下,这将起作用。

需要注意的是,有时Chrome会将几个选项卡简化为一个进程,这会杀死与该进程相关的所有选项卡。


避免while循环挂起浏览器的另一种方法是编写这样的代码(测试后可以取出):

var maxIterations = 100000; 
while (foo) {
    if (!maxIterations--) throw new Error('Max iterations hit, aborting.');
    // do stuff
}

右键单击Chrome的任务管理器,然后选择上下文菜单底部的项目,显示一个奇怪的复活节彩蛋

JavaScript没有Ctrl + C这样的东西。执行JavaScript的浏览器通常是保护自己的。如果任何JavaScript挂起,他们会抛出一个对话框,询问用户是否想停止JavaScript。

超时持续时间通常可以在浏览器的设置中找到。你可以在这里找到如何为FireFox做到这一点:http://kb.mozillazine.org/Dom.max_script_run_time

根据我对您工作方式的一点了解,我将如何进行:

  • 只在类似事件的按钮单击时执行脚本。这将阻止脚本运行onload
  • Chrome允许您在开发人员工具的脚本选项卡中设置js代码的断点

在浏览器中运行Javascript代码没有真正的"中断器"。ECMAscript在所谓的"UI线程"中执行,这意味着所有呈现内容都发生在执行ECMAsscript代码的同一队列中。

这反过来意味着,ECMAscript中的一个无限循环会自动挂起整个浏览器交互。

避免这种情况的唯一方法是编写清晰、干净的代码。如果发生这种情况,大多数浏览器都会意识到UI线程太忙太久,并询问用户是否要取消正在运行的javascript进程。如果你不想等待,你唯一的选择就是终止整个浏览器/选项卡过程。

但是,如果您知道脚本的某些部分可能会导致无限循环,则可以在某种developer tools中手动设置breakpoints,也可以将debugger;关键字直接插入到脚本中。这会导致javascript解释器停在当前行,并且您有机会分析下一个代码(例如while conditions),如果它看起来不好,则取消执行。