当它被称为日志时,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作为[].slice
和arguments
的简短forms:
window.log = (args...) -> console.log(args...)
如果你看看它的JavaScript版本,你会发现它是伪装的slice
和arguments
。
当然,如果您使用纯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); }