如果您在通过向console.log
所有可疑循环中调用调用来查找和诊断无限循环时遇到困难,请尝试使用alert
andconfirm
代替。当浏览器卡在无限循环中时,虽然console.log
可能有点不合作(或者,听起来完全不起作用),但alert
总是会立即工作。
通过确认,您甚至可以更好地走一步,并且可以选择跳出循环。例如,这里是您修改的示例代码,让您可以随时跳出循环。
jQuery(document).ready(function ($) {
var i = 0;
while(i < 10){
if (confirm("i = " + i + "; break the loop?")) {
throw new Error("Loop broken by manual user override");
}
$('#someAwesomeDiv').append('<br>i</br>')
i--;
}
});
(小提琴)。
然后,如果您遇到无限循环,您可以选择抛出错误并希望(除非它被捕获,或者立即再次触发相同的代码)重新获得对窗口的控制权,并可以在窗口和控制台中自由玩耍并尝试找出导致循环的原因。
不过要注意两点:在某些浏览器中,alert
有时confirm
可能会在代码中发生奇怪的事情,例如,当在警报期间触发 DOM 事件时,会破坏预期的执行顺序,正如 bobince 在此处详细描述的那样:https ://stackoverflow.com/a/2734311/1709587。它们可以潜在地在无限循环中帮助您console.log
,但要确保您不会被通过将alert
s 放入代码中引入的行为更改而绊倒。另请注意,当您触发警报时会发生重排,这可能会更改涉及 CSS 转换的代码的行为。
另外,我真的不确定为什么您在控制台中没有从您提供的示例代码中获得任何输出。当我将它粘贴到 jsFiddle 并在 Chrome 上尝试时,然后在打开控制台的情况下加载小提琴时,页面速度很慢且无法杀死,整个浏览器有点麻烦,但我确实看到记录的内容(诚然只有每千行或者)。在 Firefox 中,大约 5 秒内没有任何反应,但随后我得到一个“无响应页面”弹出窗口和终止正在运行的脚本的选项 - 之后我可以看到控制台中记录的所有内容。也许尝试不同的浏览器(或您使用的任何浏览器的最新版本)将使您的生活更轻松,而无需部署任何技巧?