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);
(function() { bar = 'bar'; alert('foo'); }()); alert(bar);
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;
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;
Code 2:
new ( function() { return { Class: function() { } }; }() ).Class;
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;
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!