1

我想知道是否有任何方法可以跟踪 javascript/jquery 中的无限循环?

我正在研究一个 jsTree 插件克隆类..(为什么不重要)并且我在某处创建了一个无限循环,我正在尝试跟踪它发生的位置。我想也许有浏览器特定的技巧来跟踪无限循环

例如

<div id="someAwesomeDiv"></div>

jQuery(document).ready(function ($) {
    var i = 0;
    while(i < 10){
        console.log(i);
        $('#someAwesomeDiv').append('<br>i</br>')
        i--;
    }
});

当我刷新此页面时.. 没有任何内容附加到 div 也没有 console.logged,页面只是冻结。

提前致谢。

4

2 回答 2

1

那是假定的行为。您正在使用无限循环使 JS 引擎陷入困境,它正忙于执行此操作而不是渲染(开发工具窗口中的页面和控制台)。

于 2013-06-09T12:57:17.540 回答
0

如果您在通过向console.log所有可疑循环中调用调用来查找和诊断无限循环时遇到困难,请尝试使用alertandconfirm代替。当浏览器卡在无限循环中时,虽然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,但要确保您不会被通过将alerts 放入代码中引入的行为更改而绊倒。另请注意,当您触发警报时会发生重排,这可能会更改涉及 CSS 转换的代码的行为。

另外,我真的不确定为什么您在控制台中没有从您提供的示例代码中获得任何输出。当我将它粘贴到 jsFiddle 并在 Chrome 上尝试时,然后在打开控制台的情况下加载小提琴时,页面速度很慢且无法杀死,整个浏览器有点麻烦,但我确实看到记录的内容(诚然只有每千行或者)。在 Firefox 中,大约 5 秒内没有任何反应,但随后我得到一个“无响应页面”弹出窗口和终止正在运行的脚本的选项 - 之后我可以看到控制台中记录的所有内容。也许尝试不同的浏览器(或您使用的任何浏览器的最新版本)将使您的生活更轻松,而无需部署任何技巧?

于 2013-06-09T14:00:54.570 回答