2016-12-17 4 views
3

Ich habe vor einer Weile eine halbwegs anständige Erklärung für Schließungen auf this Website gefunden. Sie präsentieren uns mit den folgenden Werksfunktion eine Arbeits Schließung zu sehen:Javascript - warum eine Schließung mit IIFE zurück?

var car; 
function carFactory(kind) { 
    var wheelCount, start; 
    wheelCount = 4; 
    start = function() { 
    console.log('started with ' + wheelCount + ' wheels.'); 
    }; 

    // Closure created here. 
    return (function() { 
    return { 
     make: kind, 
     wheels: wheelCount, 
     startEngine: start 
    }; 
    }()); 
} 

car = carFactory('Tesla'); 

// => Tesla 
console.log(car.make); 

// => started with 4 wheels. 
car.startEngine(); 

Warum diese Person geben die Schließung als sofort beschworene Funktion Ausdruck (IIFE), die ein Objekt mit den Eigenschaften zurückgibt, die er will teilen ? Ich fühle mich wie das IIFE ist unnötig. Wenn ich das Objekt sofort zurückgeben würde, würde dies zu dem gleichen Ergebnis führen. Fehle ich etwas?

//Closure created here 
    return{ 
    make: kind, 
    wheels: wheelCount, 
    startEngine: start 
    }; 
+4

Es sieht für mich nicht notwendig, auch. – Barmar

+0

Es wäre sinnvoller, wenn das IIFE Argumente hätte, obwohl sie auch dann nur Variablen in der umschließenden Funktion sein könnten. – Barmar

Antwort

0

Ja, ich glaube nicht, dass Sie etwas verpassen.

Nur gemacht, um die Erstellung einer Schließung zu zeigen. Wenn Sie nur das Objekt zurückgeben, wird es nicht als eins betrachtet (nicht das beste Beispiel).

Nach einer comment des Autors in dieser Website:

Sie müssen die selbstausführende Funktion, weil das die Handlung ist, dass die Schließung schafft. JavaScript hat nur einen Funktionsebenenbereich, so dass die einzige Möglichkeit, die freien Variablen in den umschließenden Bereich zu binden, ist, der eine Funktion aufruft.

0

Dies könnte sinnvoll sein, wenn carFactory() die Methode eines Objekts sein soll. Dann würde die dieser des zurückgegebenen Objekts (als selbst aufgerufene Funktion) geändert werden.

var obj = {}; 
 

 
obj.funA = function(){ 
 
    return { 
 
    getThis:this 
 
    }; 
 
}; 
 

 
obj.funB = function(){ 
 
    return (function(){ 
 
    return { 
 
     getThis:this 
 
    }; 
 
    })(); 
 
} 
 

 
console.log(obj.funA()); //object 
 
console.log(obj.funB()); //window