27

重複の可能性:
chrome console.log のエイリアス

これは本当にばかげていますが、console.log を省略できません (私は Chrome を使用しています)。これが私の素朴な試みです:

var log = console.log;
log("Bingo");  // Uncaught TypeError: Illegal invocation

apply() を使用する必要がありますか? でも、その場合は引数を渡す必要がありますよね?

4

2 に答える 2

78

Javascript メソッドへの参照にはオブジェクト自体への参照が含まれていないため、これは失敗します。console.logメソッドを変数に割り当て、呼び出しを に適用する簡単で正しい方法は、メソッドでメソッドconsoleを使用し、引数として渡すことです。bindlogconsole

var log = console.log.bind(console);

すべてのメソッドには隠しthis引数があり、おそらく言語設計が悪いため、メソッドへの参照を取得しても閉じられません。メソッドのbind目的は、引数を関数に事前に割り当て、関数が予期していた残りの引数を受け入れる関数を返すことです。への最初の引数bindは常に引数である必要thisがありますが、実際にはそれを使用して任意の数の引数を割り当てることができます。

を使用bindすると、より多くの引数を受け入れるメソッドの機能を失わないという顕著な利点があります。たとえば、console.log実際には任意の数の引数を受け入れることができ、それらはすべて 1 つのログ行に連結されます。

bindに追加の引数を事前に割り当てるために使用する例を次に示しconsole.logます。

var debugLog = console.log.bind(console, "DEBUG:");

呼び出すdebugLogと、ログ メッセージの先頭にDEBUG:.

于 2012-10-17T23:39:42.983 に答える
16

簡単な方法は、関数でラップすることです。

var log = function (l) {
   console.log(l);
}

ただし、 console.log は無制限の数の引数を取ることができるため、適切な方法は次のようになることに注意してください。

var l = function () {
   console.log.apply(console, arguments);
}
于 2012-10-17T23:34:23.793 に答える