2012-03-01 87 views
49

当我执行在Chrome 18测试版下面的代码我得到的错误:为什么console.log.apply()会抛出Illegal Invocation错误?

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

TypeError: Illegal invocation.

在Firefox 10它将按预期工作。

在IE9中出现错误:Object doesn't support property or method 'apply'

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

为什么它可以在Firefox中使用,但不能在Chrome和IE中使用?我希望有人能够阐明这一事件及其后果的原因。

这是关于JS斌的an executable sample

回答

104

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

FWIW,你jsBin在Chrome中失败,那么除非你将其更改为...

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

,但似乎是log只是预期的console呼叫上下文。

11

下面是一个替代的解决方案。我不确定没有参数的情况如预期的那样工作。

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

这太棒了,谢谢! – kralyk 2014-05-24 18:12:25

+0

为什么所有这些代码当你只需要传递控制台? – 2017-04-07 00:22:27

+2

申请已经有20多年了 – 2017-04-16 19:59:45

相关问题