3

私は何年もの間、公開モジュール パターンを積極的に使用してきましたが、より深く理解したいことがいくつかあります。私が理解していることから、自己実行機能の潜在的な利点は匿名性と自己実行であり、どちらもこの特定のパターンでは必要/利用されていないようです。私が理解していないもう1つのことは、以下のシナリオでは、関数InitをSocialMedia function()内にラップできるようにするもの、つまり埋め込み関数であり、自己実行関数はJSで非常にユニークな構造のように見えるということです。プロパティ値を自己実行コード ブロックに割り当てることができるのは奇妙ではありませんか?

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

        }
        return  {
            Init: Init
        }
    })()
}
4

2 に答える 2

8

明らかにするモジュールパターンで自己実行関数を使用するのはなぜですか?

JavaScriptにはファーストクラスの関数があり、ブロックスコープがないため、関数を使用して新しいスコープを導入します。

以下のシナリオでは、SocialMedia function()内で関数Initをラップすることができます。つまり、埋め込み関数です...プロパティ値を自己実行コードブロックに割り当てることができるのは不思議ではありませんか?

()JavaScriptでは、関数はandnew演算子に応答する単なるオブジェクトです。

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

自己実行関数はJSで非常にユニークな構造のようです

これはJavaScriptに固有のものではありません。ファーストクラス関数を持つすべての言語には、次のようなプロパティがあります。

  • 舌足らずの発音、
  • OCaml、
  • Scala、
  • 行け、
  • C#(デリゲート経由)、
  • C(fn ptrs経由)、
  • Python、
  • Perl(経由&)、
  • ルビー、
  • ルア

最近の言語開発では、第一級関数が規則ではなく標準になっています。静的に型付けされていない言語は、型システムの構文にオーバーヘッドがなく、分散の問題がないため、簡単になります。

Javaでさえ、 Java8向けに予定されているLambdasで時流に乗っている可能性があります。

これらの他の言語の多くでは、すぐに呼び出される関数はそれほど有用ではありません。他のほとんどの言語はブロックスコープであるため、変数を分離したい場合は、{...}ブロックを使用するだけです。ただし、JavaScriptでは、varスコープは最小の包含functionまたはプログラムであるため、functionsは新しいスコープを導入する最も簡単な方法です。

Rubyはブロックと関数をほとんど区別しないため、この点でJSに類似していると見なすことができます。

于 2012-02-26T23:29:44.730 に答える
1

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

これには 2 つの理由があります。

  • グローバルスコープの汚染を避ける
  • クロージャーの使用、つまり、追加のスコープからの関数の「エクスポート」

もちろん、スコープをスタックすることはできますが、通常、ローカル モジュール スコープの汚染を避ける必要があるような大きなモジュールは作成しません :-)

また、あなたの例の自己実行関数は役に立たない.

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

        }
    }
}
于 2012-02-26T23:55:44.777 に答える