为啥 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】:console
和 log
是主机对象。它们的行为取决于实现,并且在很大程度上不需要实现 ECMAScript 的语义。
FWIW,您的 jsBin 在 Chrome 中也会失败,除非您将其更改为...
console.log.apply(console, ['message']);
但这似乎是log
只是预期console
的调用上下文。
【讨论】:
以上是关于为啥 console.log.apply() 会抛出非法调用错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章