2016-06-30 5 views
0

In dem Underscore.js Bibliothek des gesamten Code innen gewickelt ist:Wie sind Javascript-Bibliotheken verfügbar, wenn sie in einen IIFE eingebunden sind? Ist der Ausführungskontext nicht entsorgt?

(function() { 
    //rest of library etc. 
}.call(this)); 

die Funktion Ich verstehe Einwickeln() in() ist für Namespace-Zwecke, und dass die .call (this) ruft die Bibliothek beim Start Gang das Fensterobjekt.

Aber mein Verständnis ist, dass, sobald ein Ausführungskontext beendet ist, es 'gelöscht' wird. Wie steht also der gesamte Code in dieser Bibliothek anderen Skriptdateien zur Verfügung?

Frage beantwortet wurde, aber es hat diese Frage in meinem Kopf gebracht:

Das jetzt macht Sinn für mich. Die Funktion wird ausgeführt und hängt ihre Bibliothek an das Fensterobjekt an. Wenn Sie diesen Ansatz verwenden, können sich Bibliotheken jedoch gegenseitig überschreiben, wenn sie den gleichen Objektnamen an das Fensterobjekt anhängen.

Wäre es nicht besser, wie etwas zu tun:

var library1 = function(
    var func1 = function(){ 

    }; 
    return { 
    func1: func1 
    })(this); 
+2

Es modifiziert den globalen Zustand, z.B. 'window.myNamespace = {Zeug}'. Das "Stuff" wird aufgrund der lexikalischen Schließung immer noch Zugriff auf den Ausführungskontext des IIFE haben (auch wenn es nichts anderes tut). –

Antwort

2

Dieses Konzept hier mit einem einfachen Beispiel erklärt werden kann:

//library code starts 
(function(){ 

    this.hello = function(){ 
     console.log("asd"); 
    } 

}).call(this); 
//library code ends 


//outside the library 
//will print the function showing that it is available outside the library 
console.log(window.hello); //will print the function 
console.log(hello); 

//will console.log hello 
hello(); 

Da Anruffunktion des IIFE mit dieser Anrufe (die Punkte zu Fensterobjekt), selbst wenn Sie den Wert des Fensterobjekts außerhalb des Bibliothekscodes erhalten möchten, können Sie das leicht erreichen.

Da hallo Funktion an Fensterobjekt gebunden ist, kann es außerhalb des Bibliothekscodes aufgerufen werden.

Dies gilt für alle Funktionen oder Variablen, die an das Fensterobjekt gebunden sind.

Verständnis der Ausführungskontext

Der Ausführungskontext wird nur vorgenommen, wenn eine bestimmte Funktion aufgerufen wird oder eine variable/Objekt verwendet wird.

Für jede aufgerufene Funktion wird ein anderer Ausführungskontext erstellt, der nach Abschluss der Ausführung deaktiviert wird. Das bedeutet nicht, dass das Objekt (Fenster) in diesem Fall nicht mehr Teil des Speichers sein wird.

Sie können eine Funktion 10-mal mit verschiedenen Argumenten aufrufen, und es werden 10 verschiedene Ausführungskontexte erstellt, die zur Laufzeit Speicher zuweisen und diesen nach Abschluss der Ausführung zerstören. Es hat nichts mit dem Laden des Bibliothekscodes zu tun.

+0

Das macht für mich jetzt Sinn. Die Funktion wird ausgeführt und hängt ihre Bibliothek an das Fensterobjekt an. Wenn Sie diesen Ansatz verwenden, können sich Bibliotheken jedoch gegenseitig überschreiben, wenn sie den gleichen Objektnamen an das Fensterobjekt anhängen. Wäre es nicht besser sein, etwas zu tun: var library1 = function ( var func1 = function() { }; return { func1: func1 } ) (this); –

+0

@JackClark Es würde keinen Unterschied machen; 'library1' wird genau so dargestellt. – JJJ

Verwandte Themen