Heim > Web-Frontend > js-Tutorial > Hauptteil

Sind \'(function () { } ) ( )\' und \'(function () { } ( ) )\' in JavaScript funktional identisch?

Linda Hamilton
Freigeben: 2024-10-30 07:29:03
Original
740 Leute haben es durchsucht

Are

Funktionsaufrufssyntax in JavaScript: Sind „(function ( ) { } ) ( )“ und „(function ( ) { } ( ) )“ funktional identisch?

Frage:

Betrachten Sie die folgenden zwei JavaScript-Codeblöcke:

(function()
{
    bar = 'bar';
    alert('foo');
})();

alert(bar);
Nach dem Login kopieren
(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);
Nach dem Login kopieren

Beide Codeblöcke führen Alert('foo') aus. ) und dann alarm(bar), wobei jeweils „foo“ und „bar“ angezeigt werden. Der einzige Unterschied zwischen den beiden ist die Syntax des Funktionsaufrufs. Sind sie funktional identisch?

Antwort:

Ja, im Allgemeinen sind die beiden Codeblöcke funktional gleichwertig. Beide definieren eine neue Funktion, führen sie sofort aus und greifen dann im globalen Bereich auf die Balkenvariable zu.

Ausnahmen:

Es gibt jedoch Randfälle, in denen Die beiden Syntaxen verhalten sich möglicherweise unterschiedlich. Insbesondere wenn Sie neuen Code entweder vor der Funktion oder nach einem .something innerhalb der Funktion einführen, verhalten sich diese nicht mehr identisch.

Code 1:

new (function() {
    this.prop = 4;
}) ().prop;
Nach dem Login kopieren

Dieser Code erstellt eine neue Instanz der Funktionsklasse und ruft die Prop-Eigenschaft der neuen Instanz ab und gibt 4 zurück. Er entspricht:

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;
Nach dem Login kopieren

Code 2:

new ( function() {
    return { Class: function() { } }; 
}() ).Class;
Nach dem Login kopieren

Dieser Code ruft new für die Class-Eigenschaft auf. Da die Klammern für den Funktionsaufruf innerhalb der äußeren Klammern stehen, lösen sie nicht den neuen Ausdruck aus, sondern rufen die Funktion stattdessen normal auf und geben ihren Rückgabewert zurück. Der neue Ausdruck instanziiert bis zur .Class und instanziiert diese. Es ist äquivalent zu:

var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;
Nach dem Login kopieren

Ohne Klammern um den Aufruf von getNamespace() würde dieser Code als (new getNamespace()).Class geparst werden, die getNamespace-Klasse instanziieren und die Class-Eigenschaft von zurückgeben neue Instanz.

Das obige ist der detaillierte Inhalt vonSind \'(function () { } ) ( )\' und \'(function () { } ( ) )\' in JavaScript funktional identisch?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage