如果未定义,JS如何覆盖console.log?

28

你推荐哪个解决方案,第二个更简单(代码更少),但使用它会有缺点?

第一个:(设置全局调试标志)

// the first line of code
var debug = true;
try {
    console.log
} catch(e) {
    if(e) {
        debug=false;
    }
};
// Then later in the code
if(debug) {
    console.log(something);
}

第二:覆盖console.log

try {
    console.log
} catch(e) {
    if (e) {
        console.log = function() {}
    }
};
// And all you need to do in the code is
console.log(something);
7个回答

56

不是两者之一,而是第二个的变体。不要使用try...catch,正确检查控制台对象是否存在:

if (typeof console == "undefined") {
    window.console = {
        log: function () {}
    };
}

console.log("whatever");

1
你可能想要执行 this.console = ... 或者 var console = ...?如果按照你目前的写法,在 ECMAScript 5 严格模式下会报错。 - Tim Down
1
@Tim:谢谢,那是一个疏忽。我认为window.console最适合可移植性。 - Andy E
1
可移植性是指能够将此代码移入函数中,而不是在不同环境之间的可移植性? - Tim Down
1
你应该测试 typeof window.console 吗?因为你稍后会设置 window.console,还是应该删除 window.? - jcolebrand
一定要查看下面Suresh提供的解决方案 - 他还定义了其他可能未定义的控制台方法。请参阅https://developer.mozilla.org/en-US/docs/Web/API/Console以获取所有可用的控制台方法列表和浏览器支持情况。 - Tim Holt

6
或者,使用CoffeeScript编写:
window.console ?=
    log:-> #patch so console.log() never causes error even in IE.

3

编辑: 安迪的回答 比我下面快速解决方案更加优雅。

通常我会采用以下方法...

// prevent console errors on browsers without firebug
if (!window.console) {
    window.console = {};
    window.console.log = function(){};
}

1
我喜欢你的版本Frankie,但我不确定它是否能在所有浏览器上安全运行。我记得使用这个时,在某个IE版本中仍然偶尔会出现问题,可能是因为console对象只有在IE9中打开控制台窗口时才被定义。我认为我必须像Andy E建议的那样进行“未定义”检查。 - Simon East
@Simon 这条评论来晚了,但我今天才看到。Andy的解决方案比我发布的这个快速hack要优雅得多。你应该使用那个解决方案。 - Frankie

1

我曾经遇到过类似的错误,我通过以下代码解决了它:

if(!window.console) {
    var console = {
        log : function(){},
        warn : function(){},
        error : function(){},
        time : function(){},
        timeEnd : function(){}
    }
}

这与Frankie或Andy_E的答案有何不同? - Radu Maris
Suresh的回答更好,因为他还定义了其他不会随log一起定义的方法。请查看https://developer.mozilla.org/en-US/docs/Web/API/Console以获取可能(或可能不)定义的所有函数的完整列表。 - Tim Holt
如果从函数内部调用它,这将无法工作。应该使用window.console或者只是console,而不是var console - Glenn Lawrence

0
以下代码可以实现您所需的功能:
window.console && console.log('foo');

0
window.console = window.console || {};
window.console.log = window.console.log || function() {};

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接