2012-02-26 1 views
3

私は積極的に数年前に明らかにするモジュールパターンを使用してきましたが、深く理解したいことがいくつかあります。私が自己実行機能の潜在的な利点は、この特定のパターンでは必要ない/利用されていない、自己実行型であることを理解しています。私が理解していないもう一つのことは、以下のシナリオでSocialMedia関数()内の関数Initを包括することができることです。つまり、組み込み関数では、自己実行関数はJSでは非常にユニークな構造です自己実行コードブロックにプロパティ値を割り当てることができるのは不思議です。明らかになったモジュールパターンで自己実行機能を使用するのはなぜですか?

var myObj = { 
    prop1, "prop1value", 
    SocialMedia: (function() { 
     function Init() { 

     } 
     return { 
      Init: Init 
     } 
    })() 
} 
+0

と全く同等だとして例は_、役に立たない_「それは我々だけで自己実行するコードブロックにプロパティ値を割り当てることができる不思議ではない」 - 私はそれが奇妙だとは思わない:あなたのことができプロパティを_any_式に代入するのはなぜですか?なぜ関数呼び出しの結果にならないのですか? (値を返さない関数呼び出しでさえ、効果的に未定義を返すので機能します) – nnnnnn

答えて

8

は、なぜ我々は暴露のモジュールのパターンで自己実行機能を使用していますか?機能は、新しいスコープを導入するために使用されているので、

JavaScriptは、ファーストクラスの機能を持っており、ブロック・スコープを欠いています。

は、以下のシナリオで何が...ソーシャルメディア機能()、すなわち、埋め込み機能 内の関数initをラップするために、その可能にする、それは我々がただの自己へのプロパティ値を割り当てることができる不思議ではありませんコードブロックを実行していますか?

JavaScriptでは、関数は、()およびnew演算子に応答するオブジェクトに過ぎません。

他のオブジェクトと同様に、定義したり、変数やプロパティに格納して後で使用することができます。

自己実行機能は、これはJavaScriptに固有のものではありませんJS

で非常にユニークな構造であるように見えます。 first class functionsは、例えば、この特性を持っているすべての言語:

  • のLisp、
  • をOCamlで、
  • スカラ座、
  • ゴー、
  • (代表者を経由して)
  • のC#、
  • C(経由fn ptrs)、
  • Python、
  • Perl(via &)、
  • ルビー、最近の言語発達に
  • Luaの

は、ファーストクラスの機能は標準ではなく、ルールです。型システムの構文にはオーバーヘッドがなく、varianceの問題がないため、静的に型指定されていない言語を使用すると簡単です。

Javaでも、Lambdas slated for Java 8でバンドワゴンにジャンプしている可能性があります。

他の多くの言語では、すぐに呼び出される関数はそれほど役に立ちません。他のほとんどの言語はblock-scopedなので、変数を別々にしたい場合は、ブロック{...}を使用します。ただし、JavaScriptではvarfunctionまたはProgramを含む最小のスコープになりますので、functionは新しいスコープを導入する最も簡単な方法です。

Rubyは、ブロックと関数の区別がほとんどないため、この点でJSと同様に考えることができます。

+0

ありがとうございます!どのような素晴らしい答え:) – Baconbeastnz

1

自己実行機能は、新しいスコープを導入するために使用され、Mike Samuelsの回答も参照してください。

そのための2つの理由があります。

  • あなたがスタックすることができ、余分なスコープもちろん

から機能を「エクスポート」クロージャのグローバルスコープ

  • 使用を汚染回避、すなわちスコープがありますが、通常はローカルモジュールスコープを汚染しないように大きなモジュールを作成しません:-)

    また、それは

    var myObj = { 
        prop1: "prop1value", 
        SocialMedia: { 
         Init: function Init() { 
    
         } 
        } 
    } 
    
  • +0

    はい私は通常、より多くのメソッドを入れますので、Init、CreateButtons()など、私はmyObj.SocialMedia.Init()を参照して、 – Baconbeastnz

    関連する問題