为啥 console.log.apply() 会抛出非法调用错误? [复制]

Posted

技术标签:

【中文标题】为啥 console.log.apply() 会抛出非法调用错误? [复制]【英文标题】:Why does console.log.apply() throw an Illegal Invocation error? [duplicate]为什么 console.log.apply() 会抛出非法调用错误? [复制] 【发布时间】:2012-03-20 06:50:05 【问题描述】:

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

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。

【问题讨论】:

【参考方案1】:

这是另一种解决方案。我不确定没有 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')

【讨论】:

这太棒了,谢谢! 为什么所有这些代码都必须像这样传递控制台? apply 已经存在 20 多年了【参考方案2】:

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

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

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

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

【讨论】:

以上是关于为啥 console.log.apply() 会抛出非法调用错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

console.log.apply 在 IE9 中不起作用

apply 与arguments的用法

IE9是不是支持console.log,它是一个真正的功能吗?

多浏览器调试功能

javascript函数声明和函数表达式的区别

跨浏览器Javascript调试器