2016-05-03 5 views
0

Das folgende JavaScript gegen CSP (wenn die CSP Standardeinstellung hat):Wie kann ich eine Funktion expr erstellen, die den lexikalischen Geltungsbereich nicht erbt?

(function() { 
    return new Function('return function Thing() {}'); 
}()); 

Aber diese Alternative erbt den übergeordneten Rahmen:

(function() { 
    var foo = '42'; 
    return function Thing() {}; 
}()); 

die ich glaube, verhindert foo Müll gesammelt werden.

Gibt es eine Möglichkeit, eine Funktionsdefinition im globalen Bereich zu platzieren (beachten Sie, dass ich nicht im globalen Geltungsbereich darauf verweisen, ich meine seine Definition existiert im globalen Bereich), wenn Sie Ihren Code schreiben dürfen in einem IIFE?

Antwort

2

Ich bin mir nicht sicher, was Sie hier erreichen wollen, da der von Ihnen bereitgestellte Code nichts wirklich verwendet. Die Variable foo wird erstellt und zugewiesen, und es wird eine Funktion Thing zurückgegeben, aber sobald der IIFE ausgeführt wird, gehen alle Referenzen verloren und die Garbage Collection wird ausgeführt.

Wenn ich die Funktion ein wenig nützlicher als ein Beispiel zu machen, wird erzeugen folgende die thing Funktion und die Variable foo wird noch existieren, wie es geschlossen ist vorbei - Siehe closures.

function generateThing() { 
    var foo = '42'; 
    return function thing() { 
     console.log("thing:", foo) 
    }; 
} 

var myThing = generateThing(); 
myThing(); 

Wenn Sie foo in der inneren Funktion verweisen nicht, wird die Referenz nicht aufrechterhalten werden, und es wird Müll gesammelt werden. Wenn Sie ein Objektliteral für Ihr Modul verwenden, können Sie den Bereich unter Verwendung von this einschränken. Im folgenden Beispiel verweist die Funktion generateThing auf das Feld foo des Moduls. Während der Ausführung steht dieser Wert im lexikalischen Umfang zur Verfügung. Wenn Sie jedoch eine innere Funktion erstellen, wird der Kontext this anders sein. Wenn Sie die zurückgegebene Funktion aufrufen, gibt es daher undefined aus.

Sie können den Kontext von this mithilfe der Funktion apply (unter anderem) steuern. Durch Aufruf der Funktion mit myModule als Kontext können wir auf die Variable foo verweisen.

(function() { 
    var myModule = { 
     foo: 42, 
     generateThing: function() { 
      console.log("generateThing", this.foo); 
      return function() { 
       console.log("thing:", this.foo); 
      } 
     } 
    } 

    window.myModule = myModule; 

}()); 

var thing = myModule.generateThing(); // log: generateThing 42 
thing(); // log: thing undefined 
thing.apply(myModule); // output: thing 42 
Verwandte Themen