2013-08-09 11 views
14

Warum ist die obige Funktion in Klammern eingeschlossen und warum gibt es am Ende eine ();?Erklären Sie die folgende JavaScript-Anweisung?

Ich denke, es ist eine Konstruktorfunktion wegen der (); am Ende, aber warum ist das Objekt in Klammern?

+0

Ich würde vorschlagen zu lesen, http://benalman.com/news/2010/11/immediated-invoked-function-expression/ –

+1

Siehe auch: [Wie funktioniert eine anonyme Funktion in JavaScript Arbeit?] (http://stackoverflow.com/questions/1140089/how-does-anonymous-function-in-japascript-work). –

+0

@KevinDeVoe Ihr Duplikat ist besser – Dave

Antwort

7

Dieser Code entspricht:

function Ninja() { 
    // nothing here 
} 

var ninja = new Ninja(); 

Obwohl in dem Code, den Sie aufgelistet haben, ist die Funktion/das Objekt Ninja kein globaler Bereich.

Der Code (function() {...})(); sagt im Grunde: "Nimm die Funktion, die darin enthalten ist, und führe sie sofort aus". Also wird eine anonyme Funktion erstellt und direkt danach aufgerufen.

4

Es heißt Immediately-Invoked Function Expression (oder IIFE). Es erstellt einen neuen Bereich und führt den Inhalt sofort aus. Es gibt viele Anwendungen dafür; dasjenige, das ich am meisten benutze, ist, wenn das Schlüsselwort this die Bedeutung ändern würde, z. in

var someClass = function() { 
    this.property = something; 
    this.update = (function(obj) { 
     function() { 
      $('.el').each(function() { 
       $(this).html(obj.property); 
      }); 
     }; 
    )(this); 
}; 

Während ich this Änderungen innerhalb der this.property$('.el').each(), beziehen möchten innerhalb dieses Umfangs Bedeutung und bezieht sich auf den aktuellen DOM-Element, das mit .each() durchgeschleift wird. Wenn Sie also this als Parameter an den IIFE übergeben (und diesen Parameter obj aufrufen), kann ich obj.property verwenden, um auf this.property zu verweisen, wenn außerhalb des Bereichs von $('.el').each(..., function() { ... });.

Lassen Sie mich wissen, ob das Sinn macht oder wenn Sie Fragen :)

0

Wie vorgeschlagen: zu verweis Benalman

Sofort-Ausgeführt Funktion Ausdruck (IIFE) Glücklicherweise ist die Syntaxerror „fix“ ist einfach. Die am weitesten verbreitete Methode, dem Parser mitzuteilen, dass er einen Funktionsausdruck erwartet, besteht darin, ihn in Parens einzubinden, da Parens in JavaScript keine Anweisungen enthalten können. Wenn der Parser zu diesem Zeitpunkt auf das Schlüsselwort function stößt, weiß es, dass es als Funktionsausdruck und nicht als Funktionsdeklaration analysiert werden soll.

// Eines der beiden folgenden Muster kann verwendet werden, um sofort // einen Funktionsausdruck aufzurufen, wobei der Ausführungskontext der Funktion zu // create "privacy."

(function() {/ * Code * /}()); // Crockford empfiehlt dieses

(function() {/ * Code * /})(); // Aber das funktioniert genauso gut