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

时间:2012-03-01 18:34:53

标签: javascript internet-explorer firefox google-chrome

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

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

TypeError:非法调用。

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

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

我猜这与浏览器的实现方式console.log有关。

为什么它在Firefox中有效但在Chrome和IE中无效?我希望有人可以了解这个及其后果的原因。

这是JS Bin上的an executable sample

2 个答案:

答案 0 :(得分:104)

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

FWIW,您的jsBin也会在Chrome中失败,除非您将其更改为...

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

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

答案 1 :(得分:11)

这是另一种解决方案。我不确定没有args按预期工作的情况。

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')