Heim > Web-Frontend > js-Tutorial > Sind Klammern in JavaScript-Funktionsaufrufen und -abschlüssen immer nur syntaktischer Zucker?

Sind Klammern in JavaScript-Funktionsaufrufen und -abschlüssen immer nur syntaktischer Zucker?

DDD
Freigeben: 2024-11-02 20:33:31
Original
527 Leute haben es durchsucht

Are Parentheses in JavaScript Function Calls and Closures Always Just Syntactic Sugar?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Szenario 2:

<code class="js">new ( function() {
    return { Class: function() { } }; 
}() ).Class;</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage