2013-01-23 4 views
6

私はこのように書かれた関数呼び出しと時間の夜明けからのJavaScriptのトンを持っている:JavaScriptのパターン:関数呼び出しのコンテキスト

THING.someFunction(); 

THING.someFunction.call(THING); 

いつもと同等でなければなりませんように私には思えます

これらの2つの呼び出しは常に同等ですか? JavaScriptの古いバージョンはどうですか?

THINGの2番目の目的は、文脈(this)をsomeFunctionの内側に設定することです。しかし、その関数内のコンテキストはデフォルトで既にTHINGであるはずです。はい、彼らは同じです

var THING = function() { 
    // private vars 

    return{ 
     // code 
     someFunction : function() { 
      // code 
     } 
    }; 
}(); 
+2

あなたのコードは今や 'THING.someFunction'は' undefined'です。 – gilly3

+1

私はTHING宣言の最後に括弧がないと信じています。 THING =関数{}(); –

答えて

1

だけ明確にすること、THINGはこのような何かを定義しています。そして、私は彼らがいないJavaScriptのバージョンを知らない(しかし、callは1.3に追加されたようだ)。

+1

なぜdownvote? – Bergi

+0

ファイアバグを使って私の仮説の真実をテストすることができたことに気付きました。あなたは正しいです。あなたが最初に答えたので、私はあなたに勝利を渡すでしょう。乾杯。 – theJollySin

0

技術的には同じです。しかし、それらはまた、非同期プログラミングでは若干異なる動作をします。 call()は、スコープをパラメータとして渡して関数を呼び出すために使用されます。これにより、コールバックや実行遅延(setTimeout、setInterval)で定義された関数を呼び出す便利な方法が提供されます。 JSライブラリのいずれかを使用している場合は、$ .proxyまたは_.bindに気づいたでしょう。これらは呼び出し(スコープ)を実装するエイリアスです。

詳細はthis MDN docを参照してください。

+2

なぜdownvote?私が言ったことが間違っていたことを指摘できますか?少なくとも私が何か間違ったことを理解すれば、私は自分自身を正したいと思います。 – praneetloke

+1

私はdownvoteをしませんでしたが、 'call'はスコープを設定しません。 – nnnnnn

+0

私の答えでMDNの文書を読んだことがありますか? call()の最初の引数は 'thisArg'で、スコープ(コンテキスト)を表す任意のオブジェクトに設定できます。 – praneetloke