我在我编写的一些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”条件是否真的非法?这似乎很荒谬,因为如果if (console)
是非法的,那么if (console==undefined)
也应该是非法的。
您应该如何检查undefined
变量?
答案 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
位于window
,window
总是存在,所以这应该有效:
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)
使用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
功能强>
log
,warn
,error
,info
。