2012-05-31 14 views
5

可能性の重複:
What is the purpose of a self executing function in javascript?「自己の呼び出し無名関数」の目的

うまくいけば、かなりまっすぐ進むの質問:自己匿名の呼び出しを使用する目的は何

機能?変数などを使ってグローバルスコープを「汚染する」ことを単に防止するだけですか?または、それらを使用する他の利点はありますか?

+1

これはIIFEとも呼ばれます。 http://benalman.com/news/2010/11/immediately-invoked-function-expression/を参照してください。 –

答えて

10

は、私はまた、forループの閉鎖のためにそれを使用しています。これは、DOM要素がカウントを格納する必要があり、jQueryなどのライブラリにアクセスできない場合に便利です。

要素が100 DIVであるとします。最初DIV要素をクリックすると、これらの要素を作成するとき、あなたは通常のカウンタとして、これは99に警告するこの

// 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); 
    }; 
} 

ような何かを同様だから、56

を警告すべき第56回div要素をクリックすると、1に警告すべきです現在は99です。iの値はここでは維持されません。

ただし、無名関数を問題に取り組むために使用されている場合、ここで

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

iの値が維持され、正確なカウントが表示されます。

4

グローバルスコープを変数などで「汚染」しないようにするのは簡単ですか?

かなりです。カプセル化とできるだけ多くのグローバルな状態を回避することは、それ自身の良い目標です。

+0

わかりやすいです。 – NaveenDA

3

独自のスコープを作成することです。他の(例えばグローバルな)スコープを "汚染"しなくなったので、それだけではなく、関数/オブジェクト/メソッド内部の内部を突き刺すようなプログラマーからの名前衝突の懸念や防御のためのエスケープを提供しますすべてのメリットの中でまた、機能が完了したときに参照オブジェクトを必要としないことをGCが容易に理解できるようにします。

0

Closures in for-loopsも匿名機能を使用します。スコープを誘導するために無名関数を使用するよりも、他の私の個人的な経験のうち

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); 
    } 
} 
関連する問題