2012-03-08 1 views
4

すべてのプログラマと同様に、私は怠け者です。だから私のutils.jsにシンプルなラインがあります:ログと呼ばれるときにChromeがconsole.logを認識しない

window.log = console.log 

これはFirefoxので正常に動作しますが、それは小さな男の子のようなクロームの叫びになります。私はconsole.logと書く必要があります。

提案がありますか?そして、あなたを

window.log = console.log 
log('pancakes') 

+6

'window.log = function(x){console.log(x); }; ' – nnnnnn

+4

@nnnnnn:ほぼ。 'console.log'は可変的で、最初の引数だけに注意を払っています。 –

+0

@muistooshort - だからこそ私はコメントではなく答えとして投稿した:その時、私は '.apply()'で完全な解決策を書く時間がなかったので、誰かが私に電話をかけてくれることは分かっていた。また、私はほとんど常に 'console.log()'を単一の引数で使用していますので、私自身の使用のためにはもっと扱いにくいでしょう。 (私はあなたがそれをすべて書き出したので、あなたの答えをupvotedしました。) – nnnnnn

答えて

17

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を送って、それが配列であると偽っては大丈夫です。また[].sliceargumentsものの短い形式としてCoffeeScript splatsを使用することができます。

window.log = (args...) -> console.log(args...) 

あなたはそれのJavaScriptバージョンを見れば、あなたはそれが変装しsliceargumentsものであることがわかります。

もちろん

あなたはプレーンな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をサポートしているわけではありません。

+1

muとして指定するのはあまりにも素晴らしいです。 – CamelCamelCamel

+1

+1それは一つのおいしい答えです。 –

+1

すべてのブラウザが 'console'メソッドを' .apply() '、' .call() '、' .bind() 'を使うJS関数として扱っているかどうか知っていますか?私は漠然とした考えを持っていました。少なくとも1つのブラウザがあり、それは動作しませんでしたが、私はどこを読んでいるのか思い出せず、 'alert()'のようなものと混同している可能性があります。 – nnnnnn

1

あなたがにconsole.log

window.log = function(x) { console.log(x); } 
+2

**持っていますか?どうして? –

+0

これは全体的にもっと適切だと思います。明示的にwindow.logを関数 –

関連する問題