Javascript 定义全局变量x时使Firebug中断

Javascript 定义全局变量x时使Firebug中断,javascript,debugging,firefox,scope,firebug,Javascript,Debugging,Firefox,Scope,Firebug,我们有一个非常大的JavaScript应用程序,在经过数月的编码后,不可避免地出现了一些范围错误,其中定义变量时没有使用var关键字,方式如下: function() { x = 5; ... } 而不是: function() { var x = 5; ... } 这是在某个地方发生的——我们不确定在哪里——搜索有问题的变量名是很困难的,因为它是一个常见的词,在我们的源代码中出现了1000次 有没有办法让Firebug在第一个创建给定全局变量的行上中断?为了澄清,我

我们有一个非常大的JavaScript应用程序,在经过数月的编码后,不可避免地出现了一些范围错误,其中定义变量时没有使用
var
关键字,方式如下:

function() {  
  x = 5; ...  
}
而不是:

function() {  
  var x = 5; ...  
}
这是在某个地方发生的——我们不确定在哪里——搜索有问题的变量名是很困难的,因为它是一个常见的词,在我们的源代码中出现了1000次

有没有办法让Firebug在第一个创建给定全局变量的行上中断?为了澄清,我想在
window.x
undefined
切换到已定义值的瞬间中断,并中断语句

我曾尝试创建一个watch表达式,并希望能将其转换为断点,但如果没有某种上下文或范围,我似乎无法创建watch表达式

如果Firebug不能做到这一点,我会对在Firefox中实现这一点的任何东西感兴趣。

提供了一些东西

  • 您知道变量的名称
  • 在全局范围(在函数外部声明)中没有具有该名称的变量,而只有在函数内部声明
  • 存在对声明变量的函数的调用
  • 这个小脚本可以实现以下目的:

    <script type="text/javascript">
    window.__defineSetter__("x", function(value) { console.trace(); });
    x = 1;
    </script>
    
    
    窗口。_u定义设置_uuuuuuux(“x”,函数(值){console.trace();});
    x=1;
    
    您将在分配之前获得已执行代码的跟踪


    它可能无法报告某些情况,因此请查看。加载所有JS文件并将其删除。

    以下是我通过修改Ionut G.Stan的解决方案而使用的解决方案:

    window.__defineSetter__("name", function(value) {
      if (value=="div") {
        debugger;
      }
    });
    
    我使用了
    debugger
    而不是
    console.trace()
    ,因此我可以在执行过程中停止并查看它。使用
    console.trace()


    泄漏的作用域被隐藏在Dojo中,Dojo正在将该变量设置为已处理元素的名称。

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

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

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


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

    这里有另一个只在Firefox中工作的解决方案,因为它使用Firefox特定的方法

    将这段Javascript放在html页面的最顶端,就在
    标记之后:

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

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

    代码格式化程序是否有问题?我无法让它与我的示例一起工作。是的,你必须在每一行之前添加大量空格来格式化它——在我的问题中有相同的问题:)非常好的方法(这很有效!),感谢你让我发现了“定义设置”的“魔术”方法。请参阅下面的@Maciek answer了解对他有效的方法。他使用
    调试器
    而不是
    console.trace
    来进行调试。我最初使用了“debugger”,但我看不到分配变量的行,所以我认为这对您没有帮助。不管怎样,我很高兴能帮上忙。