web-dev-qa-db-ja.com

console.log.apply()が不正な呼び出しエラーをスローするのはなぜですか?

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にあります。

49
joshuapoehls

consolelogはHostオブジェクトです。それらの動作は実装依存であり、ECMAScriptのセマンティクスを実装するために大部分は必要ありません。

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

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

しかし、それはlogconsoleの呼び出しコンテキストを単純に予測しているようです。

105
user1106925

これが代替ソリューションです。引数がない場合が期待どおりに動作するかどうかはわかりません。

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')
11
jimmont