Chrome没有'当console.log's称为log

Chrome doesn't recognize console.log when it's called log

本文关键字:log 称为 没有 console Chrome      更新时间:2023-09-26

和所有程序员一样,我很懒。所以在我的utils.js中有一条简单的线:

window.log = console.log

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

有什么建议吗?

Chrome的console.log显然关注this是什么,所以如果你这样做:

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

然后,您的工作只会得到一个"TypeError:非法调用"异常。然而,如果你这样强迫适当的上下文:

log.apply(console, 'pancakes')

那么您将在控制台中获得pancakes。这就是为什么如果你想懒惰,只说log,就需要将console.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强制在console:的上下文中调用log

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

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

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

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