我正在努力接管一个代码库,测试以确保console.warn
存在如下:
if (window.console) {
console.warn("shhaabang");
}
但是,我的问题是它只能在你有窗口对象的浏览器中运行。这似乎也有效。
if (console && typeof console.warn == 'function') {
console.warn("shhaabang");
}
此方法有任何缺点吗?有没有更好的方法不假设存在window
?我应该先看看窗口或全局是否存在并检查两者吗?
澄清至少我应该明白,我在没有window
对象的情况下测试它。但是,要明确我在node.js以及浏览器中运行它
答案 0 :(得分:2)
考虑使用已经提交过这个而不是重新发明轮子的javascript日志框架。例如,尝试loglevel。
以下是loglevel如何处理安全日志记录(view full source):
function realMethod(methodName) {
if (typeof console === undefinedType) {
return false; // We can't build a real method without a console to log to
} else if (console[methodName] !== undefined) {
return bindMethod(console, methodName);
} else if (console.log !== undefined) {
return bindMethod(console, 'log');
} else {
return noop;
}
}
function bindMethod(obj, methodName) {
var method = obj[methodName];
if (typeof method.bind === 'function') {
return method.bind(obj);
} else {
try {
return Function.prototype.bind.call(method, obj);
} catch (e) {
// Missing bind shim or IE8 + Modernizr, fallback to wrapping
return function() {
return Function.prototype.apply.apply(method, [obj, arguments]);
};
}
}
}
答案 1 :(得分:0)
你不应该做
if(console && typeof console.warn == "function"){ ... }
因为如果未定义控制台,则会抛出错误
您可以使用this
e.g:
if(this.console){
console.warn("shhaabang");
}
编辑:哦对不起,我刚注意到两件事:
1)这仅在this
未被更改时才有效...谢谢@Evan Carroll
2)这在strict mode
中不起作用,因为在strict mode
中,this
是undefined
所以这是另一种方法:
var c;
try {
c = console;
} catch(e){
// console is not defined
}
if(c) {
// console is defined
}else{
// this will not throw because you declared `c` earlier
}