8

明確にするために編集-@ Qantas94Heavy-それが「言っている」こと、または行うべきことを理解します。

JS モジュール パターンに関する高度なチュートリアルを読んでいたところ、次の例がありました。

var MODULE = (function (my) {
// add capabilities...

return my;
}(MODULE || {}));

私を悩ませているのは(そしてあなたの助けが必要です)最後の声明です:

(MODULE || {}));

これを可能にする背後にある構文規則を理解するのに苦労しています。「JavaScript Module Syntax」、「Module Pattern Short Hand」などのキーワードを検索した結果、この背後にある基盤をまだよく理解していないことがわかりました。

誰かがこれを理解したり、より深い理解を得るための正しい方向を説明したり、指摘してくれませんか?

よろしくお願いします。

4

3 に答える 3

7
(function(){

})();

自己呼び出しの無名関数です。あなたの場合、それは「my」オブジェクトパラメーターを処理します。「my」に対して何かを行い、それを返します。

あなたの場合、関数が受け取る「my」パラメーターは「(MODULE || {})」です。

&& と || 演算子は短絡演算子と呼ばれます。|| 「MODULE」オブジェクトが存在する場合は「MODULE」オブジェクトを返します。それ以外の場合は、関数内で使用するために空のオブジェクトが作成されます。この関数は、返された「MODULE」オブジェクトになるオブジェクトに対して行うことは何でも行います。

これはクロージャーを作成することによって機能します。MODULE が存在する限り (ガベージ コレクションされていません)、割り当て時の状態と共に自己呼び出しの無名関数も存在します。これにより、追加されたすべての機能が永続的になります。

于 2013-08-24T17:36:12.177 に答える
3

右辺は即時関数と呼ばれます。それがどのように機能するかを理解するために、少し分解してみましょう。

  1. (...)()関数を名前で呼び出すことができますf()。ただし、関数名の代わりに、関数型の変数に解決される任意の式を配置できます。この場合、最初の括弧のセットは単に式を囲んでいます。2 番目のセットは関数呼び出し演算子です。最終的に(f)()は、とまったく同じですf()

  2. 2 番目のステップは、最初の括弧セット内に無名関数を提供することです。結果は次のとおり(function(){})()です。無名関数は完全に関数型です。これにより、関数がすべて同じステートメントで作成、実行、および破棄されます。

  3. 関数呼び出し演算子である括弧の 2 番目のセットは、その中にパラメーターを受け入れることができますMODULE || {}。この式はMODULE、定義されている場合はそれを使用し、そうでない場合は新しい空のものを作成することを意味します。

  4. パラメーターは、呼び出される引数として無名関数に渡され、無名関数myは um, を返しますmy。これにより、無名関数が に評価されmy、実際には:になり(my)(MODULE || {})ます。

  5. 効果はMODULE自己完結型であり、外部変数との名前の衝突は発生しません。同時に、外部変数にアクセスできます。

これで解決することを願っています:)

于 2013-08-24T18:11:36.733 に答える