【问题标题】:Internet Explorer: "console is not defined" ErrorInternet Explorer:“未定义控制台”错误
【发布时间】:2012-03-15 17:36:17
【问题描述】:

我在编写的一些 JavaScript 中使用了console.log(),在 Internet Explorer 中抛出了一个错误:console is not defined(在其他浏览器中运行良好)。

我已将其替换为:

if (console) console.log("...");

如果consoleundefined,我希望条件评估为false。因此,console.log 语句不会被执行,也不会抛出错误。

相反,会抛出一个错误:console is not defined at character 4

这是一个 IE 错误吗?或者那个“如果”条件真的是非法的吗?这似乎很荒谬,因为如果if (console) 是非法的,那么if (console==undefined) 也应该是非法的。

您应该如何检查undefined 变量?

【问题讨论】:

  • console 在 IE 中不存在,除非控制台实际上是打开的。
  • 顺便说一句,您可能还有另一个 console 对象,因此万无一失的解决方案是检查 console.log 是否存在并且是一个函数。
  • 我真的写了“Ergo”吗???或者这是@Matt McDonald 编辑的?
  • Ergo 是由最后一位编辑“user1385191”添加的 :)

标签: javascript internet-explorer internet-explorer-8 console undefined


【解决方案1】:

其他答案为您提供了根本原因。 但是,有一个比在调用 console.* 之前使用 if 更好的解决方案

在包含任何使用控制台的脚本之前添加(一次):

//Ensures there will be no 'console is undefined' errors
window.console = window.console || (function(){
    var c = {}; c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile = c.clear = c.exception = c.trace = c.assert = function(s){};
    return c;
})();

这将仅在不存在时创建一个“伪”控制台,这样“控制台未定义”错误就会消失,您不必每次都询问控制台是否存在。 有了这个,你只需在任何地方调用console.log 或任何控制台方法,没有问题。

希望这会有所帮助。 干杯

【讨论】:

  • 我在上面进行了编辑 - 在函数签名中使用参数(我任意选择了名称 logMsg)以保持一致,因为您将传递要打印到日志的内容。这也避免了启用 JS 的 IDE 中的任何智能感知错误
  • 我仍然面临错误,但通过删除初始窗口来管理它 (console = window.console || (function(){... & 它适用于我在 IE 8 以后的版本。
【解决方案2】:

如果console 它自己 根本不存在,它会抛出一个错误,因为您正在访问一个未定义的变量。就像if(abc) {} 抛出错误一样。

由于console 驻留在window 中,而window 确实 始终存在,这应该可以:

if(window.console) ...

基本上,访问不存在的 属性 是免费的并且不会引发错误(它只是评估为 undefined,不符合 if 条件)。但是,访问未声明的变量是非法的。

【讨论】:

  • 你也可以这样做:if( typeof console === 'undefined')
  • 老实说,我发现这个更简洁......但他们不应该有任何差异(除了他们的确切评估)。
  • 有什么理由不作为this 的骗子关闭?同样的问题,同样的答案。
  • @GGG:是的,我不知道这个问题,这就是原因:)
  • @pimvdb 我也没有,直到我四处寻找它;)
【解决方案3】:

在 Internet Explorer 中,控制台对象实际上并未定义,除非您的开发人员工具在窗口加载时处于打开状态。

要解决您的问题,请将您的所有控制台打印内容包含在 if 语句中:

if (typeof window.console !== 'undefined') {
    ...
}

您还需要在打开开发者工具后刷新每个页面才能看到控制台打印。

【讨论】:

  • “窗口加载时” .. !!为此 +1
【解决方案4】:

关于未声明的变量,这是一件有趣的事情。 JS 引擎尝试将变量解析为window 的属性。所以通常,foo == window.foo

但是,如果该属性不存在,则会引发错误。

alert(foo); // Syntax error: foo is not defined

(应该是“foo is not declared”恕我直言,但无论如何。)当您明确引用窗口的属性时,不会发生该错误:

alert(window.foo); // undefined

...或声明该变量:

var foo;
alert(foo); // undefined

...或将其用于初始化:

foo = 1; // window.foo = 1

奇怪的是typeof 操作符也防止了这个错误:

alert(typeof foo); // "undefined"

所以,总结一下:你不能在表达式中使用未声明的变量,除非window 的属性具有相同的名称,或者你将它用作typeof 的操作数。在您的示例中,window.console 不存在,也没有 var 声明。这就是你得到错误的原因。

【讨论】:

    【解决方案5】:

    这个怎么样?不过没试过

    if (typeof console == "undefined" || typeof console.log == "undefined") var console = { log: function() {} };
    

    【讨论】:

      【解决方案6】:

      编辑@yckart's answer

      使用 c.length 作为定义 c 的函数的输入将不起作用。此外,当您应该向 window.console 添加方法时,您只是在使用 noop 重新分配数组中的项目。

      (function(w){
        var c = 'assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,table,time,timeEnd,timeStamp,trace,warn'.split(','),
        noop = function () {};
      
        w.console = w.console || (function (len) {
          var ret = {};
          while (len--) { ret[c[len]] = noop; }
          return ret;
        }(c.length));
      })(window);
      

      【讨论】:

        【解决方案7】:

        您可以使用以下内容为您已涵盖所有基础的额外保险提供一定程度的保障。首先使用typeof 将避免任何undefined 错误。使用=== 还将确保类型的名称实际上是字符串“未定义”。最后,您需要向函数签名添加一个参数(我随意选择了logMsg)以确保一致性,因为您确实将要打印到控制台的任何内容传递给日志函数。这还可以让您的智能感知准确,并避免您的 JS IDE 中出现任何警告/错误。

        if(!window.console || typeof console === "undefined") {
          var console = { log: function (logMsg) { } };
        }
        

        【讨论】:

          【解决方案8】:

          受到@Edgar Villegas Alvaradoanswer的启发,完成了方法并使其更简单:

          (function(w){
            var c = 'assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,table,time,timeEnd,timeStamp,trace,warn'.split(','),
            noop = function () {};
          
            w.console = w.console || (function (len) {
              var ret = {};
              while (len--) { ret[c[len]] = noop; }
              return ret;
            }(c.length));
          })(window);
          

          已编辑以放入 IIFE 并修复语法错误!

          【讨论】:

            【解决方案9】:

            当开发工具关闭时,某些浏览器没有启用console。此外,禁用控制台的 WebView 或 iFrame 也会遇到此问题。

            这些情况下的错误是 - Uncaught ReferenceError: console is not defined

            受这里许多答案的启发,我为此用例开发了一个库:https://github.com/sunnykgupta/jsLogger

            特点:

            1. 它安全地覆盖了 console.log。
            2. 请注意控制台是否不可用(哦,是的,您也需要考虑这一点。)
            3. 存储所有日志(即使它们被禁止)以供以后检索。
            4. 处理主要的控制台功能,如logwarnerrorinfo

            【讨论】:

              猜你喜欢
              • 2011-03-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多