2013-07-11 5 views
17
アンダースコア

私は_.isFunction()関数のソースを読んと、この行を見た中で使用typeof演算(/./)==「関数」:理由です

if (typeof (/./) !== 'function') { 

をし、それは、理由は私は理解していません!そこ。 /./は常にobjectのように見える正規表現です。なぜ_.isFunctionになりましたかタイプがfunctionの場合を再定義しませんでしたか?様々なJavaScriptのエンジンの

+4

ここで答える:http://stackoverflow.com/questions/5054352/why-use-typeof-for-identifying-a-function/5054396#5054396 – Dogbert

+0

ああ、それでは、誤って正規表現を関数と見なすことを避けることですか?ニース。優れた質問。 – ZenMaster

+3

"なぜ_.isFunctionを定義しないのですか" - それは再定義されています。オリジナルのtoString()定義は2ブロック上にあります。 – Rup

答えて

16

一部のバージョンでは.exec()を使用する別の方法としてRegExpを呼び出すために許可されています:彼らがいたことから、

var pattern = /./; 

pattern('abc'); 
pattern.exec('abc'); 

そしてコーラブルtypeof considered them functions:の

タイプval:オブジェクト(ネイティブまたはホストで[[Call]]を実装しています)
結果:"function"

私の知る限り、現在のバージョンはこの動作を示さず、TypeErrorを投げます。しかし、下位互換性に懸念がある場合、Underscoreのように、それを確認する必要があります。

+0

@ruakhエンジンは、[[[Call]] '](http://es5.github.io/#x15.3.4.5.1)を使用していない限り、それらを呼び出し可能にする。あなたは例を知っていますか? –

+0

おっと、申し訳ありませんが、Dogbertがリンクしている答えを誤解し、Firefox 3.6.13がこのようなエンジンを使用していると考えました。だから私の上記のコメントは(おそらく)間違っています。私はそれを削除します。 – ruakh