8

重複の可能性:
javascriptの自己実行関数の目的は何ですか?

うまくいけば、非常に簡単な質問です。

自己呼び出し無名関数を使用する目的は何ですか?変数などでグローバルスコープを「汚染」するのを防ぐだけですか?または、それらを使用することには他の利点がありますか?

4

4 に答える 4

11

私の個人的な経験から、スコープを誘導するために無名関数を使用する以外に、クロージャーのforループでも使用しました。これは、DOM要素がそのカウントを格納する必要があり、jQueryなどのライブラリにアクセスできない場合に役立ちます。

DIV100個の要素があるとしましょう。最初のDIV要素をクリックするとアラート1が表示され、同様に56番目のdiv要素をクリックするとアラート56が表示されます。

したがって、これらの要素を作成するときは、通常、次のようなことを行います

// Assume myElements is a collection of the aforementioned div elements

for (var i = 0; i < 100; ++i) {
    myElements[i].onclick = function() {
        alert( 'You clicked on: ' + i );
    };
}

カウンターは現在99であるため、これは99を警告します。の値はiここでは維持されません。

ただし、匿名関数を使用して問題に取り組む場合、

for (var i = 0; i < 100; ++i) {
    (function(count){
     myElements[count].onclick = function() {
         alert( 'You clicked on: ' + count );
     }; 
    })(i);
}

ここでは、の値iが維持され、正しいカウントが表示されます。

于 2012-05-31T10:31:45.340 に答える
4

変数などでグローバルスコープを「汚染」するのを防ぐだけですか?

かなり。カプセル化と可能な限り多くのグローバルな状態を回避することは、それ自体が良い目標です。

于 2012-05-31T10:26:15.637 に答える
3

独自のスコープを作成することです。他の(たとえばグローバルな)スコープを「汚染」しなくなっただけでなく、名前の衝突の懸念や、関数/オブジェクト/メソッドの内部を突っ込みすぎたプログラマーからの防御を確実に回避できます。すべての利点の中で。また、関数が実行されたときに、参照されるオブジェクトが不要になったことをGCが簡単に理解できるようになります。

于 2012-05-31T10:28:52.973 に答える
0

forループのクロージャも、自己呼び出し無名関数を使用します。

function attachEventsToListItems( ) {
    var oList = document.getElementById('myList');
    var aListItems = oList.getElementsByTagName('li');
    for(var i = 0; i < aListItems.length; i++) {
        var oListItem = aListItems[i];
        // Watch this:
        oListItem.onclick = (function(value) {
            return function() {
                alert(value);
            }
        })(i);
    }
}
于 2012-05-31T10:28:53.937 に答える