520 Stimmen

Was ist der Zweck einer selbstausführenden Funktion in Javascript?

In javascript, wann würden Sie dies verwenden möchten:

(function(){
    //Bunch of code...
})();

darüber:

//Bunch of code...

13voto

Lonely Punkte 6634

Ich habe alle Antworten gelesen, Hier fehlt etwas sehr Wichtiges Ich werde KISS. Es gibt 2 Hauptgründe, warum ich selbstausführende anonyme Funktionen brauche, oder besser gesagt " Unmittelbar ausgelöster Funktionsausdruck (IIFE) ":

  1. Bessere Namespace-Verwaltung (Vermeidung von Namespace Pollution -> JS Module)
  2. Closures (Simulation von privaten Klassenmitgliedern, wie aus OOP bekannt)

Der erste Punkt wurde bereits sehr gut erklärt. Für den zweiten Fall lesen Sie bitte das folgende Beispiel:

var MyClosureObject = (function (){
  var MyName = 'Michael Jackson RIP';
  return {
    getMyName: function () { return MyName;},
    setMyName: function (name) { MyName = name}
  }
}());

Achtung 1: Wir ordnen keine Funktion zu MyClosureObject , weiter das Ergebnis des Aufrufs dieser Funktion . Achten Sie auf () in der letzten Zeile.

Achtung 2: Was Sie zusätzlich über Funktionen in Javascript wissen müssen, ist, dass die inneren Funktionen Zugriff auf die Parameter und Variablen der Funktionen, in denen sie definiert sind.

Lassen Sie uns einige Experimente durchführen:

Ich kann die MyName mit getMyName und es funktioniert:

 console.log(MyClosureObject.getMyName()); 
 // Michael Jackson RIP

Der folgende naive Ansatz würde nicht funktionieren:

console.log(MyClosureObject.MyName); 
// undefined

Ich kann aber einen anderen Namen eingeben und erhalte das erwartete Ergebnis:

MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName()); 
// George Michael RIP

Editar: Im obigen Beispiel MyClosureObject ist für die Verwendung ohne die new Präfix, daher sollte es vereinbarungsgemäß nicht groß geschrieben werden.

7voto

chaos Punkte 118918

Isolierung des Bereichs, vielleicht. Damit die Variablen innerhalb der Funktionsdeklaration nicht den äußeren Namensraum verschmutzen.

Natürlich, auf die Hälfte der JS-Implementierungen da draußen, werden sie sowieso.

7voto

stesch Punkte 7183

Gibt es einen Parameter und das "Bündel Code" gibt eine Funktion zurück?

var a = function(x) { return function() { document.write(x); } }(something);

Verschluss. Der Wert von something wird von der Funktion verwendet, die der a . something könnte einen variablen Wert haben (for-Schleife), und jedes Mal, wenn a eine neue Funktion hat.

7voto

sg.cc Punkte 1616

Hier ist ein gutes Beispiel dafür, wie eine selbstaufrufende anonyme Funktion nützlich sein kann.

for( var i = 0; i < 10; i++ ) {
  setTimeout(function(){
    console.log(i)
  })
}

Ausgabe: 10, 10, 10, 10, 10...

for( var i = 0; i < 10; i++ ) {
  (function(num){
    setTimeout(function(){
      console.log(num)
    })
  })(i)
}

Ausgabe: 0, 1, 2, 3, 4...

3voto

Guffa Punkte 663241

Ein Unterschied besteht darin, dass die Variablen, die Sie in der Funktion deklarieren, lokal sind, d. h. sie verschwinden, wenn Sie die Funktion verlassen, und sie stehen nicht in Konflikt mit anderen Variablen in anderem oder gleichem Code.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X