【问题标题】:How to check if 'debugger;' keyword exists?如何检查'调试器;'关键字存在吗?
【发布时间】:2011-03-24 10:57:06
【问题描述】:

有时有些开发者忘记在 javascript 代码中删除 debugger;,这会在 IE 上产生 javascript 错误。 如果存在调试器,如何检查(例如控制台:if(window.console){console.log('foo');})?

顺便说一句:我不想检测浏览器是否是 IE,如果可能的话我想要一个通用的方法 谢谢,

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你不能。

    最好的解决方案是在您的版本控制系统中添加一个挂钩,以防止包含debugger; 语句的代码被提交/推送。

    让您的开发人员搜索 debugger; 或至少在提交之前仔细查看差异也是一种解决方案 - 但不如在 VCS 中硬拒绝有效。

    【讨论】:

    • 甚至没有try ... catch 块?
    • No.. debugger; 是为了闯入调试器,而不是被抓住。
    【解决方案2】:

    您可以尝试编译一个将debugger 声明为局部变量的函数。如果debugger被保留为关键字,JS引擎会抛出一个你可以捕捉到的错误。

    var debuggerIsKeyword = false;
    try {
        new Function("var debugger;");
    } catch(e) {
        debuggerIsKeyword = true;
    }
    

    但是我不确定知道关键字是否存在是否真的有用。

    【讨论】:

      【解决方案3】:

      也许最安全的方法是为所有项目创建一个全局包含文件,如果调试器不存在,则将其存根:

      if (typeof debugger == 'undefined') {
          window.debugger = null;
      }
      

      这样对调试器的调用就变成了对 null 的引用。这是无害的。似乎比期望健忘的开发人员将每个调试器调用包装在 if 语句中更好的方法。

      同样的方法适用于 console.log 等

      编辑:正如 AndrewF 所指出的,调试器实际上是一个关键字,而不是全局的,所以这不起作用。使用下面的代码也可以达到同样的效果,不会报错:

      window['debugger'] = null;
      

      【讨论】:

      • debugger 是一个保留字,因此它“不得用作变量、函数、方法或对象标识符”。这段代码应该会导致解析错误。
      【解决方案4】:

      由于缺少 IE 没有尝试过,但这应该可以:

      if (typeof console !== 'undefined') {
        console.log("logging enabled");    
      }
      

      【讨论】:

      • 然后使用if (typeof debugger !== 'undefined') {dowhatever();}
      • 这永远不会起作用,因为调试器是一个关键字而不是一个类型......你不会期望 'typeof for' 产生任何有意义的东西吗?
      • if (typeof Debug !== 'undefined') {dowhatever();}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      相关资源
      最近更新 更多