Ich verstehe, dass jede Funktion in JavaScript ein erstklassiges Objekt ist und eine interne Eigenschaft [[scope]] hat, die die Bindungsdatensätze der freien Variablen der Funktion enthält. Es gibt jedoch zwei spezielle Fälle.Stimmt es, dass jede Funktion in JavaScript eine Schließung ist?
Ist die Funktion erstellt von Function Constructor auch eine Schließung? Das Funktionsobjekt, das von Function-Konstruktor erstellt wird, ist speziell, da sein [[Bereich]] möglicherweise nicht auf die lexikalischen Umgebungen seiner äußeren Funktionen verweist, sondern nur auf den globalen Kontext. Zum Beispiel
var a = 1; var fn = (function outer() { var a = 2; var inner = new Function('alert(a); '); return inner; })(); fn(); // will alert 1, not 2.
Dies ist nicht intuitiv. Wird das auch Schließung genannt?
Wenn eine innere Funktion keine freien Variablen hat, können wir dann sagen, dass eine Schließung gebildet wird, wenn die innere Funktion erzeugt wird? Beispiel:
In diesem Fall verweist fn auf ein leeres Funktionsobjekt, das als innere Funktion erstellt wurde. Es hat keine freien Variablen. Können wir in diesem Fall sagen, dass ein Verschluss gebildet wird?
Also, was ist Ihre Definition von "closure"? – Bergi
Weitere Kommentare zu diesem Verhalten finden Sie hier: http://www.bennadel.com/blog/1909-jacascript-function-constructor-does-not-create-a-closure.htm Das Verhalten scheint mit 'eval' Verhalten (indirekter oder direkter Anruf). Siehe auch hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function --- * "Funktionen, die mit dem Function-Konstruktor erstellt wurden, erzeugen keine Schließungen für ihre Erstellungskontexte; sie werden immer im globalen Bereich erstellt."* –
Frage # 2 ist eher eine philosophische" wenn ein Baum fällt in einem Wald "Frage. – JJJ