【问题标题】: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

【问题讨论】:

    标签: javascript internet-explorer firefox google-chrome


    【解决方案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 的调用上下文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多