Chromeのconsole.log
は明らかにあなたがこれを行う場合はそうである何this
に注意を払って含まれている機能としてwindow.log定義する必要がありますあなたの努力のために "TypeError:Illegal invocation"例外以上のものは何も得られません。あなたは以下のようなものを適切なコンテキストを強制する場合は、:
log.apply(console, 'pancakes')
を、あなたは、コンソールであなたのpancakes
を取得します。そのため、怠け者になりたいと思って、ちょうどlog
と言う場合、関数内にconsole.log
をラップする必要があります。console.log
の実装を適切なコンテキストで呼び出す必要があります。
しかし、ちょうどwindow.log = (x) -> console.log(x)
は正しくありません。console.log
は可変的な機能です。
window.log = -> console.log.apply(console, arguments)
や知識をひけらかすことにする、arguments
ではないので、配列とFunction#apply
は通常の方法で本当のアレイに配列、「キャスト」arguments
を期待:
window.log = -> console.log.apply(console, Array::slice.call(arguments))
より良い実装はこのことでしょう
これはどこでも同じように動作し、variadicの性質をconsole.log
に保ちます。私はあなたがそのペナントでなければならないとは思っていません。ちょうどarguments
を送って、それが配列であると偽っては大丈夫です。また[].slice
とarguments
ものの短い形式としてCoffeeScript splatsを使用することができます。
window.log = (args...) -> console.log(args...)
あなたはそれのJavaScriptバージョンを見れば、あなたはそれが変装しslice
とarguments
ものであることがわかります。
もちろん
あなたはプレーンなJavaScriptを使用している場合、これらのいずれかが動作します:
window.log = console.log.bind(console)
:
window.log = function() { console.log.apply(console, arguments) };
window.log = function() { console.log.apply(console, Array.prototype.slice.call(arguments)) };
別のオプションはconsole
のコンテキストで呼び出されるlog
を強制的にFunction#bind
を使用することです
すべてのブラウザがbind
をサポートしているわけではありません。
'window.log = function(x){console.log(x); }; ' – nnnnnn
@nnnnnn:ほぼ。 'console.log'は可変的で、最初の引数だけに注意を払っています。 –
@muistooshort - だからこそ私はコメントではなく答えとして投稿した:その時、私は '.apply()'で完全な解決策を書く時間がなかったので、誰かが私に電話をかけてくれることは分かっていた。また、私はほとんど常に 'console.log()'を単一の引数で使用していますので、私自身の使用のためにはもっと扱いにくいでしょう。 (私はあなたがそれをすべて書き出したので、あなたの答えをupvotedしました。) – nnnnnn