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

时间:2012-03-08 03:10:51

标签: javascript jquery google-chrome coffeescript

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

window.log = console.log

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

有什么建议吗?

2 个答案:

答案 0 :(得分:17)

Chrome console.log显然会关注this是什么,如果您这样做:

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

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

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需要一个数组,以通常的方式“投射”arguments到一个真正的数组:

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

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

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强制在log的上下文中调用console

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

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

答案 1 :(得分:1)

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

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