7

1 つの JavaScript ライブラリを調べていると、次のような構造が見つかりました。

theMethod: function () {
    var m1 = new SomeClass();
    return function (theParameter) {
        this.someMethod();
        m1.methodCall(this.someField1);
        this.someField2 = 'some value';
    }
}()

theMethod は次のように呼び出されます。

c.theMethod(paramValue);

著者はこの宣言で何を言いたかったのですか?

そのような宣言を使用しない理由:

theMethod: function (theParameter) {
    var m1 = new SomeClass();
    this.someMethod();
    m1.methodCall(this.someField1);
    this.someField2 = 'some value';
}
4

4 に答える 4

5

関数の外で変数を宣言すると、関数は毎回同じオブジェクトを使用します。

例 (簡単にするために、オブジェクトの代わりに整数を使用):

var c = { 
    theMethod: function () {
        var m1 = 0;
        return function (theParameter) {
            m1++;
            console.log( m1 );
        }
    }()
};

c.theMethod(); c.theMethod();  // output: 1 2


var d = { 
    theMethod: function () {
        return function (theParameter) {
            var m1 = 0;
            m1++;
            console.log( m1 );
        }
    }()
};

d.theMethod(); d.theMethod();  // output: 1 1

自己呼び出し関数は次のように機能します。

var c = { 
    theMethod: function () {
        var m1 = 0;
        return function (theParameter) {
            m1++;
            console.log( m1 );
        }
    }()
};

オブジェクトcが作成されると、自己呼び出し関数がそれ自体を呼び出しtheMethod、その関数の戻り値と等しくなります。この場合、戻り値は別の関数です。

c.theMethod = function( theParameter ) {
    m1++;
    console.log( m1 );
};

m1関数が定義されたときにスコープ内にあったため、変数は関数で使用できます。

これからc.theMethod()呼び出すときは、オブジェクトが宣言されたときに一度だけ実行される自己呼び出し関数から返された内部関数を常に実行します。

自己呼び出し関数は、他の関数と同じように機能します。検討:

var c = { 
    theMethod: parseInt( someVariable, 10 )
};

変数parseInt()を使用するたびに実行する必要はありません。元のように無名関数にc.theMethod置き換えると、まったく同じものになります。parseInt

于 2013-06-21T12:34:41.070 に答える
1

著者はこの宣言で何を言いたかったのですか?

m1すべての呼び出しで値を再利用する必要があること。クロージャーのない代替手段では、SomeClass呼び出しごとに新しいオブジェクトをインスタンス化します。単にパフォーマンスを向上させるために使用されるか、(および)m1オブジェクト内の共通の状態を維持するために使用されます。

于 2013-06-21T12:40:09.010 に答える