2010-09-19 58 views
3

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

而且,是萤火虫仍然被认为是“最好的”调试器(我自己,我不能看到Safari /铬萤火虫和Web开发工具多大区别)。

任何一个愉快的星期天都有什么!

+2

你如何定义“最佳”? Firebug为您提供几乎所有标准调试器所需的功能,如单步执行代码,断点等。 – rkg 2010-09-19 08:14:50

+0

使用浏览器作为ide的想法,您可以在其中进行模拟,这真的很酷!为了好玩,我还在JavaScript中实现了一个频道编码器(编码理论)。我发现Opera的运行速度最快,到目前为止您的体验如何? – ustun 2010-09-19 15:07:35

+0

大多使用萤火虫,因为即时通讯在Linux上。工作正常,但当它挂起它可以得到技巧凌乱。 – Buzzzz 2010-09-20 13:34:31

回答

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 JS文件,该文件在其自己的线程中执行,并且仅在主浏览器不需要时才占用CPU资源。最终的结果是,你的CPU仍然像现在这样,但你的浏览器保持快速和响应。

这是第一次建立网络工作者的有点害虫,但在这种情况下,你只需要做一次。如果你的算法永远不会返回,只需点击按钮并杀死工作线程。有关更多信息,请参阅MDC上的Using Web Workers

+0

好吧,我猜,我必须学会不发现新的方式来做无限循环似乎;)。 – Buzzzz 2010-09-19 11:51:00

+0

那么,你可以做的另一件事是创建一个键盘事件,它设置你的代码查找的值。当条件满足时,您可以退出或抛出异常。问题在于,通常键盘回调在队列中如此之低,以至于杀死浏览器通常会更快。 – Andrew 2010-09-19 12:06:02

+0

感谢您接受我的回答。我已经添加了一条您可能想要阅读的有关使用网络工作人员的说明。这可能正是你需要的。加上它非常尖端,总是很酷。 – Andrew 2010-09-19 15:03:49

1

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

至于一种杀死你的无尽循环的方式。有些浏览器会阻止这种情况发生。不过,我仍然宁愿只是去ctrl + w,但这仍然关闭选项卡。

一些其他的替代品,你可以看看:

歌剧:蜻蜓

Safari /铬:Web检查

虽然,Opera有一个很好的一套开发工具,我发现很有用。 (工具 - >高级 - >开发工具)

+0

我主要使用Firefox或Safari,但IE中的开发人员工具出奇的好,尽管你仍然需要使用Fiddler来监视文件请求。我不会使用IE来处理执行时间是这样的问题的任何JS,但是对于一般的Web调试来说,这是相当不错的。 – Andrew 2010-09-19 12:09:59

0

虽然Firebug或webkit调试器很不错,但浏览器看起来像是Project Euler的东西。为什么不使用像RhinoV8这样的运行时间?

+0

嗯,但我真的很喜欢调试器,我想那个node.js没有(或者可以在浏览器之外没有node.js的情况下运行V8)? – Buzzzz 2010-09-19 11:49:19