定义全局变量x时,Firebug会中断

时间:2009-06-18 15:24:30

标签: javascript debugging firefox scope firebug

我们有一个非常大的JavaScript应用程序,经过几个月的编码后,不可避免地出现了几个范围滑点,其中定义变量时不使用var关键字,如下所示:

function() {  
  x = 5; ...  
}

而不是:

function() {  
  var x = 5; ...  
}

这发生在某个地方 - 我们不确定在哪里 - 并且搜索有问题的变量名称很困难,因为它是我们源代码中出现1000次的常用词。

有没有办法让Firebug在首先创建给定全局变量的行上中断?为了澄清,我想在window.xundefined切换到定义值并断开语句的那一刻打破。

我已经尝试创建一个监视表达式,并希望我可以把它变成一个断点,但我似乎无法在没有某种上下文或范围的情况下创建监视表达式。

如果使用Firebug无法做到这一点,我会对能在Firefox中完成此任务的任何事情感兴趣。

5 个答案:

答案 0 :(得分:12)

提供了一些东西

  1. 您知道变量的名称
  2. 您在全局范围内没有具有该名称的变量(在函数外部声明),但仅在函数内部。
  3. 调用声明变量的函数。
  4. 这个小脚本可以解决问题:

    <script type="text/javascript">
    window.__defineSetter__("x", function(value) { console.trace(); });
    x = 1;
    </script>
    

    在分配之前,您将获得已执行代码的跟踪。

    可能无法报告某些情况,因此请查看JSLint。将所有JS文件加载到那里并将它们拖入。

答案 1 :(得分:2)

这是我通过修改Ionut G. Stan的解决方案最终使用的解决方案:

window.__defineSetter__("name", function(value) {
  if (value=="div") {
    debugger;
  }
});

我使用debugger代替console.trace(),所以我可以停止并在执行中查看它。 console.trace()由于此行执行了很多次,我得到了大量的跟踪语句。

漏洞范围被证实埋没在Dojo中,Dojo将该变量设置为已处理元素的名称。

答案 2 :(得分:2)

这是另一种仅适用于Firefox的解决方案,因为它使用特定于Firefox的watch方法。

将这段Javascript放在html页面的最顶部,就在<head>标记之后:

<script>
window.watch('x', function() { debugger });
</script>

请注意watch适用于任何Javascript对象(window是全局Javascript对象)。

答案 3 :(得分:1)

在SeaMonkey浏览器上查看您的网页(我使用版本1.1.16)并查看错误控制台,您将看到针对未声明变量的每个分配的此类型的消息:

Warning: assignment to undeclared variable x
Source File: http://....js
Line: ##

答案 4 :(得分:0)

除了调试之外,我还建议您使用JSLint检查您的代码,该代码会将全局范围内的意外分配报告为错误。

jslint有几个命令行包,例如jslint4java,可以在Ant build scripts中跨平台使用。