Internet Explorer:“未定义控制台”错误

时间:2012-03-15 17:36:18

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

我在我编写的一些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”条件是否真的非法?这似乎很荒谬,因为如果if (console)是非法的,那么if (console==undefined)也应该是非法的。

您应该如何检查undefined变量?

9 个答案:

答案 0 :(得分:31)

其他答案给了你根本原因。 但是,在调用if

之前,有一个比使用console.*更好的解决方案

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

//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或任何控制台方法,没有问题。

希望这会有所帮助。 干杯

答案 1 :(得分:25)

如果console 本身根本不存在,则会因为您正在访问未定义的变量而引发错误。就像if(abc) {}引发错误一样。

由于console位于windowwindow 总是存在,所以这应该有效:

if(window.console) ...

基本上,访问不存在的属性是免费的,不会抛出错误(它只是评估为undefined,导致if条件失败。但是,访问未声明的变量是非法的。

答案 2 :(得分:7)

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

解决问题,将所有控制台打印件包装在if语句中:

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

在打开开发人员工具后,您还需要刷新每个页面才能看到控制台打印。 < 3 IE

答案 3 :(得分:4)

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

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

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

(应该是“foo不是声明”imho,但无论如何。)当明确引用窗口的属性时,不会发生该错误:

alert(window.foo); // undefined

...或声明该变量:

var foo;
alert(foo); // undefined

...或者用它进行初始化:

foo = 1; // window.foo = 1

奇怪的是,typeof运算符也可以防止出现此错误:

alert(typeof foo); // "undefined"

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

答案 4 :(得分:3)

这个怎么样?虽然没有尝试过

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

答案 5 :(得分:1)

编辑@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);

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

@Edgar Villegas Alvarado answer的启发,完成了方法并使其更简单:

(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并修复语法错误!

答案 8 :(得分:0)

当dev-tools关闭时,某些浏览器没有启用console。此外,人们会在禁用控制台的WebViews或iFrames中遇到此问题。

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

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

功能

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