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

问题描述 投票:0回答:10

我在编写的一些 JavaScript 中使用了

console.log()
,并且在 Internet Explorer 中抛出了以下错误:
console is not defined
(在其他浏览器中运行良好)。

我已将其替换为:

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

如果

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

相反,会抛出错误:

console is not defined at character 4

这是 IE 的错误吗?或者这个“如果”条件真的违法吗?这看起来很荒谬,因为如果

if (console)
是非法的,那么
if (console==undefined)
也应该是非法的。

你应该如何检查

undefined
变量?

javascript internet-explorer internet-explorer-8 console undefined
10个回答
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
或任何控制台方法,就不会出现问题。

希望这有帮助。 干杯


24
投票

如果

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

由于

console
驻留在
window
中,并且
window
确实 始终存在,所以这应该有效:

if(window.console) ...

基本上,访问不存在的 property 是免费的,并且不会抛出错误(它只是计算为

undefined
,不满足
if
条件)。但是,访问未声明的变量是非法的。


7
投票

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

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

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

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


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 声明。这就是你收到错误的原因。


3
投票

这个怎么样?不过还没试过

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

1
投票

编辑@yckart的答案

使用 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);

0
投票

您可以使用以下内容来提供额外的保险,确保您已涵盖所有基础。 首先使用

typeof
将避免任何
undefined
错误。 使用
===
还可以确保类型的名称实际上是字符串“undefined”。 最后,您需要向函数签名添加一个参数(我任意选择
logMsg
)以确保一致性,因为您确实将想要打印到控制台的任何内容传递给日志函数。 这也能让您的智能感知准确,并避免 JS 感知 IDE 中出现任何警告/错误。

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

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


0
投票

某些浏览器在开发工具关闭时不会启用

console
。此外,在禁用控制台的 WebView 或 iFrame 中也会遇到此问题。

这些情况下的错误是 -

Uncaught ReferenceError: console is not defined

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

特点:

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

0
投票

http://192.168.0.1/index.html?_t=6379428#SYS_SET#0

页面.level=1

VM580:1 未捕获的引用错误:页面未定义 于:1:1

© www.soinside.com 2019 - 2024. All rights reserved.