为什么console.log.apply()会抛出非法调用错误?

当我在Chrome 18testing版中执行以下代码时,出现错误:

console.log.apply(this, ['message']); 

TypeError:非法调用。

在Firefox 10中,它按预期工作。

在IE9中,我得到错误: Object doesn't support property or method 'apply'

我猜这与浏览器如何实现console.log

为什么它在Firefox中工作,而不是在Chrome和IE中? 我希望有人能够揭示这个及其后果的原因。

这里是一个 JS Bin 的可执行示例 。

consolelog是主机对象。 他们的行为是依赖于实现的,在很大程度上不需要实现ECMAScript的语义。

FWIW,你的jsBin在Chrome中失败,除非你改变它…

 console.log.apply(console, ['message']); 

但是这似乎是log只是预测console的调用上下文。

这是另一种解决scheme。 我不确定没有参数的情况如预期的那样工作。

 function logr(){ var i = -1, l = arguments.length, args = [], fn = 'console.log(args)'; while(++i<l){ args.push('args['+i+']'); }; fn = new Function('args',fn.replace(/args/,args.join(','))); fn(arguments); }; logr(1,2,3); logr(); logr({},this,'done')