像所有程序员一样,我很懒。所以在我的utils.js
中有一个简单的界限:
window.log = console.log
这在 firefox 中运行良好,但它让Chrome像小男孩一样哭泣。我必须写console.log
才能使它发挥作用。
有什么建议吗?
答案 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作为[].slice
和arguments
内容的简短形式:
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
强制在log
的上下文中调用console
:
window.log = console.log.bind(console)
缺点是并非每个浏览器都支持bind
。
答案 1 :(得分:1)
您必须将window.log定义为包含console.log
的函数window.log = function(x) { console.log(x); }