代码之家  ›  专栏  ›  技术社区  ›  Maciek

在定义全局变量x时中断Firebug

  •  15
  • Maciek  · 技术社区  · 17 年前

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

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

    而不是:

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

    这发生在某个地方——我们不确定在哪里——搜索相关变量名很困难,因为它是一个常见的词,在我们的源代码中出现了1000次。

    有没有方法要求firebug在第一个创建给定全局变量的行上中断?为了澄清,我想在 window.x 开关从 undefined 到定义的值,并中断语句。

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

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

    5 回复  |  直到 11 年前
        1
  •  12
  •   Sebastian Zartner Emmanouil Chountasis    11 年前

    提供了一些东西

    1. 你知道变量的名字
    2. 在全局范围(在函数外部声明)中没有具有该名称的变量,而只在函数内部声明。
    3. 存在对声明变量的函数的调用。

    这个小脚本可以做到这一点:

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

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

    它可能无法报告某些情况,因此请看一下 JSLint . 在那里加载所有的JS文件并将它们进行lint。

        2
  •  2
  •   Husky    13 年前

    这是另一个只在火狐中工作的解决方案,因为它使用火狐特有的 watch 方法。

    把这段javascript放在HTML页面的最上面,就在 <head> 标签:

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

    注意 在任何javascript对象上工作( window 是全局javascript对象)。

        3
  •  2
  •   Sebastian Zartner Emmanouil Chountasis    11 年前

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

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

    我用过 debugger 而不是 console.trace() 所以我可以在执行过程中停下来看看。用 控制台,跟踪() 由于这行执行了多次,我得到了无数个跟踪语句。

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

        4
  •  1
  •   HBP    17 年前

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

    Warning: assignment to undeclared variable x
    Source File: http://....js
    Line: ##
    
        5
  •  0
  •   Eric Bréchemier    15 年前

    除了调试之外,我建议您使用 JSLint ,它将全局范围中的意外分配报告为错误。

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