Sind Ausdrucksabschluss und Funktionsaufruf in JavaScript identisch?
In JavaScript scheinen die folgenden Codeausschnitte eine identische Ausgabe zu erzeugen:
<code class="js">(function() { bar = 'bar'; alert('foo'); })(); (function() { bar = 'bar'; alert('foo'); }());</code>
Beide Blöcke führen die Anweisung „alert('foo')“ aus und deklarieren eine Variable bar, auf die außerhalb des Abschlusses zugegriffen werden kann. Der einzige offensichtliche Unterschied liegt in der Syntax des Abschlusses, der Verwendung von )()} im Vergleich zu }());.
Sind diese Konstrukte funktional gleichwertig?
Antwort :Ja, sie sind identisch.
Zusätzliche Überlegungen:
Wenn zusätzliche Klammern eingeführt werden, ändert sich das Verhalten. Betrachten Sie die folgenden Szenarios:
Szenario 1:
<code class="js">new (function() { this.prop = 4; })().prop;</code>
Dieser Ausdruck erstellt eine neue Instanz der Funktionsklasse und greift auf die prop-Eigenschaft der neuen Instanz zu und gibt zurück der Wert 4. Es entspricht:
<code class="js">function MyClass() { this.prop = 4; } new MyClass().prop;</code>
Szenario 2:
<code class="js">new ( function() { return { Class: function() { } }; }() ).Class;</code>
In diesem Fall instanziiert der neue Ausdruck die Class-Eigenschaft der Funktion Rückgabewert. Die Klammern um den Funktionsaufruf sind entscheidend und geben an, dass die Funktion sofort aufgerufen werden sollte.
Dies entspricht:
<code class="js">var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; // Or, new namespace.Class;</code>
Wenn die Klammern aus dem Aufruf von getNamespace() entfernt wurden , würde der Ausdruck die getNamespace-Klasse instanziieren und auf die Class-Eigenschaft der neuen Instanz zugreifen.
Das obige ist der detaillierte Inhalt vonSind Klammern in JavaScript-Funktionsaufrufen und -abschlüssen immer nur syntaktischer Zucker?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!