2016-06-21 20 views
1

Meine Frage ist von der Verwendung new function(){ ... } über new Function();JavaScript neue Funktion Ausdruck und neue Funktion Konstruktor

Mein Verständnis so weit/Annahme

  • das resultierende Objekt bezüglich Wenn wir eine Funktion Funktion create() oder new Function() erhalten wir ein Objekt als Funktion konfiguriert (seine internen Steckplätze zeigen ein Funktionstyp-Objekt an)
  • Mit oder ohne den neuen Operator gibt der Konstruktor Function() eine neue Funktion obj zurück
  • ect
  • einen Funktionsausdruck Mit liefert ein Funktionsobjekt, das intern verwendet die Funktion() Konstruktor
  • Eine Funktion Ausdruck Optimierung mit Parsen der Funktionskörper

Meine Frage meine Vermutung

Nach liefert oben, warum gibt new Function(); und new function(){ ... } verschiedene Dinge zurück?

Die erste gibt ein Funktionsobjekt zurück, aber das letztere gibt ein Standardobjekt zurück. Wenn ein Funktionsausdruck unter der Haube den Konstruktor Function() verwendet, warum verhält sich dieser nicht genauso wie new Function();?

Mit new function(){ ...} würde ich ein Funktionsobjekt, kein Standardobjekt erwarten.

+2

'function() {} == neue Funktion()', 'neue Funktion() {} == neue neue Funktion()' . – zzzzBov

Antwort

2

Die folgenden Zeilen sind im wesentlichen die gleichen:

function foo(...) {...} 
var foo = function (...) {...}; 
var foo = new Function (...); 

Sie sind alle um eine neue Funktion zu erklären (was ein Objekt ist, das eine Instanz Function ist, der den Prototyp Object erbt, ...) in der aktueller Bereich, auf den über die Variable foo zugegriffen werden kann.

Das Schlüsselwort new instanziiert ein Objekt aus einer Funktion, mit der Sie etwas erstellen können, das einer Klasseninstanz in einer Standard-OOP-Sprache ähnelt.

Fortsetzung des Beispiels von oben:

var bar = new foo(...) 

würde eine Instanz der foo Funktion in dem aktuellen Bereich instanziieren, der über die variable bar zugegriffen werden konnte.

Warum gibt new Function(); und new function(){ ... } verschiedene Dinge zurück?


Ich werde das Beispiel etwas umformulieren. Statt:

new Function() 
//and 
new function(){ ... } 

Ich werde

new Function() 
//and 
var foo = function() { ... }; 
new foo(); 

Der Grund verwenden, die new Function() gibt eine andere Sache als new foo() vollständig ist, weil Function eine andere Funktion foo ist.

Ich erwarte, dass Sie nicht durch die Tatsache verwirrt sind, dass new Object() ein anderes Objekt mit anderen Funktionen als new Array() zurückgibt. Das Gleiche passiert hier.

Da ein Funktionsausdruck unter der Haube des Function() Konstruktor verwendet, warum diese die gleiche wie new Function(); nicht verhalten?

unter der Haube des spätere Ausdruck ist im Wesentlichen:

new (new Function (...)) 
+0

Große Antwort, danke. – Brummy

1

neue Funktion (...) gibt eine neue Funktion , während neue function() {...} ein neues Objekt zurückgibt.

Im Grunde ist Funktion nur eine Möglichkeit, ein Stück Code zu bewerten.

Objekte sind eine Möglichkeit, Daten in Javascript zu speichern.

Side Hinweis: Sie können technisch

new (new Function(...)) 

wich zurück, um ein neues Objekt tun.

Verwandte Themen