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

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

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

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

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

这种方法有什么缺点吗?有没有更好的方法不承担窗口的存在?我应该先看看窗口或全局是否存在并检查两者?

澄清至少我应该明白,我在没有窗口对象的东西中测试它.但是,要明确我在node.js以及浏览器中运行它

最佳答案 考虑使用已经交付了这个而不是重新发明轮子的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]);
            };
        }
    }
}
点赞