2012-03-01 4 views
49

私はクロム18ベータ版に次のコードを実行すると、私はエラーを取得する:Firefoxの10でなぜconsole.log.apply()はIllegal Invocationエラーをスローしますか?

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

TypeError: Illegal invocation.

期待どおりに動作します。

IE9では、エラー:Object doesn't support property or method 'apply'が表示されます。

これは、ブラウザがconsole.logの実装方法と関係があります。

Firefoxでは動作しますが、ChromeとIEでは動作しないのはなぜですか?私は、誰かがこれとその影響の原因について何らかの光を当てることができると願っています。

ここにはJS Binのan executable sampleがあります。

答えて

104

consoleおよびlogはホストオブジェクトです。それらの振る舞いは実装に依存しており、ECMAScriptのセマンティクスを実装するために大部分は必要とされません。

FWIW、あなたのjsBinにも、あなたがそれを変更しない限り、Chromeで失敗した...

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

それはlogは、単にconsoleの呼び出しコンテキストを予想していることのようです。

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

これは素晴らしく、ありがとう! – kralyk

+0

あなたは単にこれをコンソールとして渡す必要があるときに、このコードをすべてなぜですか? –

+2

適用されてから20年以上 –

関連する問題