2012-03-11 86 views
8

在控制台,Chrome和Firefox中,按Ctrl + C的等效功能是什么?在实现各种算法时,我经常在Javascript中写一些不退出的buggy(while)循环,导致浏览器冻结。重新加载不起作用,点击关闭该选项卡的小X不会执行任何操作,并且在一段时间内(字面上)我已经失去了内存,系统正在交换,并且我要离开休息一下。你如何在浏览器中断JS?

+0

ctrl + alt + del – user544262772 2012-03-11 22:22:39

+3

我不得不承认,这对于浏览器开发者来说更​​像是“动力”,以解决这种情况。 – skrat 2012-03-13 16:24:55

+0

坦率地说,现有的JS执行者是愚蠢的,他们不能做这么简单的事情。 – Pacerier 2017-06-18 22:25:56

回答

5

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

超时时间通常可以在浏览器的设置中找到。您可以在这里找到如何为FireFox执行此操作:http://www.trixya.net/index.php/internet/how-to-set-javascript-timeout-in-firefox

+1

当我的系统已经交换时,他们的确会抛出该对话。 – skrat 2012-03-13 16:26:21

5

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

需要注意的是,Chrome有时会将多个标签简化为一个进程,这会终止与进程相关的所有标签。


另一种方法,你可以去避免while环吊的浏览器是写这样的代码(你可以把它拿出来测试后):

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

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

+0

'while(foo && --maxIterations){...}' – vol7ron 2012-03-11 22:32:19

+0

@ vol7ron我把maxIterations的东西放在与代码的其余部分分开的行中,所以如果需要它可以很容易地剥离出来 – 2012-03-11 22:34:31

+0

我明白你是什么这样做。对我而言,删除并保持所有内容紧密结合会更轻松。有一个单独的if块将其分开了一点 - 你必须实际读入while块,而不仅仅是查看不能缩放的前提条件和条件 – vol7ron 2012-03-12 04:57:26

1

从一点点的见解我到您的工作,我将如何着手的方法是:

  • 只执行像按钮单击事件的脚本。这将运行脚本防止onload
  • Chrome可让您在您的js代码中设置断点在开发工具
0

在浏览器中运行Javascript代码没有真正的“中断器”。 ECMAscript在所谓的“UI线程”中执行,这意味着所有渲染的东西都发生在ECMAscript代码执行的同一队列中。

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

,以避免这一点的唯一方法是写清楚,干净的代码。如果它发生,大多数浏览器都意识到UI线程忙得太久,并询问用户是否要取消正在运行的JavaScript进程。如果你不想等,那么唯一的选择是杀死整个浏览器/标签进程。

但是,如果你知道你的脚本的某些部分确实可能导致无限循环,你可以手动在某种developer tools设置breakpoints或者你可以直接将debugger;关键字为你的脚本。这会导致JavaScript解释器在当前行中停止,并且您有机会分析下一个代码(例如条件),并在它看起来很糟糕时取消执行。

+2

我无法做任何事情,试试'while(1){}'循环,并尝试获得一个干净的退出(关闭标签,关闭窗口等) – skrat 2012-03-13 16:27:34