3

我最近开始修补 Project Euler 问题,并尝试用 Javascript 解决它们。这样做我往往会产生许多无限循环,现在我想知道是否有比杀死 Firefox 或 Chrome 中的选项卡更好的方法来终止脚本?

此外,firebug 是否仍然被认为是“最好的”调试器(我自己在 safari/chrome 中看不到 firebug 和 web 开发工具之间有太大区别)。

无论如何,祝你有个愉快的星期天!

4

3 回答 3

1

Firebug 仍然是我个人首选的工具。

至于杀死你无限循环的方法。一些浏览器会完全阻止这种情况发生。但是,我仍然更喜欢只使用ctrl+ w,但这仍然会关闭选项卡。

您可以研究的其他一些替代方案:

歌剧:蜻蜓

Safari / Chrome:网络检查器

虽然,Opera 有一套不错的开发者工具,我发现它们非常有用。(工具->高级->开发者工具)

于 2010-09-19T08:13:54.303 回答
0

如果您不想输入代码以显式退出,请尝试使用条件断点。如果您打开 Firebug 的脚本控制台并右键单击代码旁边的装订线,它将插入一个断点并为您提供触发断点满足某些条件的选项。例如,如果您的代码是这样的:

var intMaxIterations = 10000;
var go = function() {
    while(intMaxInterations > 0) {
        /*DO SOMETHING*/
        intMaxIterations--;
    }
};

...您可以等待循环的所有 10,000 次迭代完成,或者您可以在循环内的某处放置一个条件断点并指定条件intMaxIterations < 9000。这将允许循环内的代码运行 1000 次(实际上是 1001 次)。此时,如果您愿意,可以刷新页面。

但是,一旦脚本进入无限循环(无论是由于错误还是设计),如果您还没有为此做好准备,我所知道的没有什么可以阻止它继续执行的事情。这通常就是为什么当我在做大量递归的事情时,我会限制特定代码块可以运行的次数。有很多方法可以做到这一点。如果您认为该行为是实际错误,请考虑抛出它。例如

var intMaxIterations = 10000;
var go = function() {
    while(true) {
        /*DO SOMETHING*/
        intMaxIterations--;

        if (intMaxIterations < 0) {
            throw "Too many iterations. Halting";
        }
    }
};

编辑:我突然想到,因为你是唯一使用这个脚本的人,所以网络工作者是理想的解决方案。

您看到的基本问题是,当 JS 进入无限循环时,它会阻塞浏览器,使其无法响应您通常用来停止执行的任何事件。Web Worker 仍然一样快,但它们让您的浏览器没有负担,并且事件正常触发。这个想法是你将你的高需求任务(在这种情况下,你的欧拉问题算法)传递给一个 web worker JS 文件,该文件在它自己的线程中执行,并且仅在主浏览器不需要它们时才消耗 CPU 资源。最终结果是您的 CPU 仍然像现在一样飙升,但您的浏览器保持快速响应。

第一次设置 web worker 有点麻烦,但在这种情况下你只需要做一次。如果您的算法永远不会返回,只需单击一个按钮并终止工作线程。有关详细信息,请参阅在 MDC 上使用 Web Worker。

于 2010-09-19T08:52:40.733 回答
0

虽然拥有 Firebug 或 webkit 调试器很好,但浏览器对于 Project Euler 的东西来说似乎是开销。为什么不使用像RhinoV8这样的运行时?

于 2010-09-19T09:04:56.703 回答