当它被称为日志时,Chrome无法识别console.log

像所有程序员一样,我很懒。 所以在我的utils.js有一个简单的行:

 window.log = console.log 

这在firefox中运行良好,但它让Chrome像小男孩一样哭泣。 我必须编写console.log才能使它工作。

有什么建议?

如果你这样做,Chrome的console.log显然会注意到this一点:

 window.log = console.log log('pancakes') 

那么你只会为你的努力获得“TypeError:Illegal invocation”exception。 但是,如果您强制执行适当的上下文:

 log.apply(console, 'pancakes') 

然后你会在控制台里拿到你的pancakes 。 这就是为什么你需要在一个函数中包装console.log ,如果你想要懒惰并且只是说log :一些console.log实现需要用适当的上下文调用。

但是,只是window.log = (x) -> console.log(x)不太正确,因为console.log是一个可变参数函数。 一个更好的实现是这样的:

 window.log = -> console.log.apply(console, arguments) 

或者是迂腐,因为arguments不是一个数组而且Function#apply需要一个数组,以通常的方式将“cast” arguments传递给一个真正的数组:

 window.log = -> console.log.apply(console, Array::slice.call(arguments)) 

这应该在任何地方都一样,并保持console.log的可变性质。 我怀疑你是否需要那种迂腐,只是发送arguments并假装它是一个数组应该没问题。 你也可以使用CoffeeScript splats作为[].slicearguments的简短forms:

 window.log = (args...) -> console.log(args...) 

如果你看看它的JavaScript版本,你会发现它是伪装的slicearguments

当然,如果您使用纯JavaScript,那么其中一个将起作用:

 window.log = function() { console.log.apply(console, arguments) }; window.log = function() { console.log.apply(console, Array.prototype.slice.call(arguments)) }; 

另一个选择是使用Function#bind强制在console的上下文中调用log

 window.log = console.log.bind(console) 

缺点是并非每个浏览器都支持bind

您必须将window.log定义为包含console.log的函数

 window.log = function(x) { console.log(x); }