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
DDDOriginal
2024-11-02 20:33:31528Durchsuche

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>

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!

Stellungnahme:
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