我在编写的一些 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
变量?
其他答案给了你根本原因。 但是,有一个比在调用
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
或任何控制台方法,就不会出现问题。
希望这有帮助。 干杯
如果
console
itself 根本不存在,则会抛出错误,因为您正在访问未定义的变量。就像 if(abc) {}
抛出错误一样。
由于
console
驻留在 window
中,并且 window
确实 始终存在,所以这应该有效:
if(window.console) ...
基本上,访问不存在的 property 是免费的,并且不会抛出错误(它只是计算为
undefined
,不满足 if
条件)。但是,访问未声明的变量是非法的。
在 Internet Explorer 中,控制台对象实际上并未定义,除非您的开发人员工具在窗口加载时打开。
要解决您的问题,请将所有控制台打印内容包含在 if 语句中:
if (typeof window.console !== 'undefined') {
...
}
打开开发者工具后,您还需要刷新每个页面才能看到控制台打印结果。 <3 IE
关于未声明的变量,这是一件有趣的事情。 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 声明。这就是你收到错误的原因。
这个怎么样?不过还没试过
if (typeof console == "undefined" || typeof console.log == "undefined") var console = { log: function() {} };
使用 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);
您可以使用以下内容来提供额外的保险,确保您已涵盖所有基础。 首先使用
typeof
将避免任何 undefined
错误。 使用 ===
还可以确保类型的名称实际上是字符串“undefined”。 最后,您需要向函数签名添加一个参数(我任意选择 logMsg
)以确保一致性,因为您确实将想要打印到控制台的任何内容传递给日志函数。 这也能让您的智能感知准确,并避免 JS 感知 IDE 中出现任何警告/错误。
if(!window.console || typeof console === "undefined") {
var console = { log: function (logMsg) { } };
}
受到@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 并修复语法错误!
某些浏览器在开发工具关闭时不会启用
console
。此外,在禁用控制台的 WebView 或 iFrame 中也会遇到此问题。
这些情况下的错误是 -
Uncaught ReferenceError: console is not defined
受到这里许多答案的启发,我为此用例开发了一个库:https://github.com/sunnykgupta/jsLogger
特点:
log
、warn
、error
、info
。