如何最好地安全地使用console.log和console.warn?

时间:2015-10-21 15:54:27

标签: javascript cross-browser cross-platform ecmascript-5 console.log

我正在努力接管一个代码库,测试以确保console.warn存在如下:

if (window.console) {                                                                                                                                                                                                                                                      
  console.warn("shhaabang");                                                                                                                                                                                                    
}                                                                                                                                                                                                                                                                          

但是,我的问题是它只能在你有窗口对象的浏览器中运行。这似乎也有效。

if (console && typeof console.warn == 'function') {                                                                                                                                                                                                                                                      
  console.warn("shhaabang");                                                                                                                                                                                                    
}

此方法有任何缺点吗?有没有更好的方法不假设存在window?我应该先看看窗口或全局是否存在并检查两者吗?

澄清至少我应该明白,我在没有window对象的情况下测试它。但是,要明确我在node.js以及浏览器中运行它

2 个答案:

答案 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中,thisundefined

所以这是另一种方法:

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
}