2012-05-31 12 views
5

Mögliche Duplizieren:
What is the purpose of a self executing function in javascript?Der Zweck der "Self Hervorrufen von Anonyme Funktionen"

Hoffentlich ziemlich straight forward Frage:

Was ist der Zweck der Verwendung von selbst Berufung auf anonyme Funktionen? Ist es einfach, den globalen Geltungsbereich durch Variablen usw. nicht zu "verschmutzen"? Oder gibt es andere Vorteile, sie zu verwenden?

+1

Dies wird auch als IIFE bezeichnet. Siehe http://benalman.com/news/2010/11/immediately-invoked-function-expression/. –

Antwort

10

Aus meiner persönlichen Erfahrung, andere als anonyme Funktionen für einen Bereich zu induzieren, ich habe es auch in for-Schleifen für die Schließung. Dies kann nützlich sein, wenn ein DOM-Element seine Anzahl speichern muss und Sie keinen Zugriff auf Bibliotheken wie jQuery usw. haben.

Nehmen wir an, Sie haben eine 100 DIV Elemente. das erste DIV Element anklicken sollte 1 alarmieren, in ähnlicher Weise das 56th div Element klicken sollten 56.

So warnen, wenn diese Elemente zu schaffen, die Sie normalerweise so etwas wie dieses Diese Warnung

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

tun 99 wird, wie der Zähler ist derzeit 99. Der Wert von i wird hier nicht beibehalten.

Wenn jedoch eine anonyme Funktion verwendet wird, um das Problem zu lösen,

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

Hier ist der Wert von i beibehalten und die richtige Anzahl angezeigt wird.

4

Ist es einfach zu verhindern, dass der globale Geltungsbereich mit Variablen usw. "verschmutzt"?

Ziemlich viel. Die Verkapselung und die Vermeidung möglichst vieler globaler Staaten sind gute Ziele für sich.

+0

Ich denke, es ist verständlicher. – NaveenDA

3

Es ist ein eigener Bereich zu erstellen. Es ist nicht nur besser, weil Sie einen anderen (globalen, beispielsweise) Bereich nicht mehr "verschmutzen", es gibt Ihnen garantierte Flucht vor Namenskollisionsproblemen und Verteidigung vor Programmierern, die gerne innerhalb von Interna Ihrer Funktionen/Objekte/Methoden herumstochern unter all den Vorteilen. Es ermöglicht GC auch leicht zu verstehen, dass Sie keine referenzierten Objekte mehr benötigen, wenn die Funktion ausgeführt wird.

0

Closures in for-loops verwenden Sie auch selbstaufrufende anonyme Funktionen.

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