2013-08-09 13 views
14

Perché la funzione sopra incapsulata tra parentesi e perché c'è un (); alla fine?Spiega la seguente dichiarazione JavaScript?

Penso che sia una funzione di costruzione a causa dello (); alla fine, ma perché l'oggetto è racchiuso tra parentesi?

+0

Vorrei suggerire di leggere, http://benalman.com/news/2010/11/immediately-invoked-function-expression/ –

+1

Vedi anche: [Come funziona una funzione anonima in JavaScript lavoro?] (http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work). –

+0

@KevinDeVoe il tuo duplicato è migliore – Dave

risposta

7

Questo codice è equivalente a:

function Ninja() { 
    // nothing here 
} 

var ninja = new Ninja(); 

Anche se nel codice che hai elencato, la funzione/oggetto Ninja non è un ambito globale.

Il codice (function() {...})(); in pratica dice "prendi qualsiasi funzione sia contenuta qui e eseguila immediatamente". Quindi sta creando una funzione anonima e la chiama subito dopo.

4

Si chiama Immediately-Invoked Function Expression (o IIFE). Crea un nuovo ambito ed esegue immediatamente il contenuto. Ci sono molti usi per questo; quello che uso di più è quando la parola chiave this cambierà significato, ad es. in

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

Mentre voglio consultare this.property all'interno delle $('.el').each(), this significato cambia in tale ambito e si riferisce all'elemento DOM corrente che viene collegato in cascata con .each(). Quindi, passando this come parametro nell'IFE (e chiamando il parametro obj), è possibile utilizzare obj.property per fare riferimento a ciò che è this.property quando non rientra nell'ambito di $('.el').each(..., function() { ... });.

fatemi sapere se questo ha un senso o se avete domande :)

0

Come suggerito: Facendo riferimento alla Benalman

Immediatamente-Invocato espressione di una funzione (IIFE) Fortunatamente, il “fix” SyntaxError è semplice. Il modo più largamente accettato per dire al parser di aspettarsi un'espressione di funzione è solo racchiudere tra parentesi, perché in JavaScript, il paren non può contenere istruzioni. A questo punto, quando il parser incontra la parola chiave function, è in grado di analizzarlo come espressione di funzione e non come dichiarazione di funzione.

// È possibile utilizzare uno dei seguenti due motivi per richiamare immediatamente // un'espressione di funzione, utilizzando il contesto di esecuzione della funzione su // creare "privacy."

(function() {/ * codice * /}()); // Crockford raccomanda questo

(function() {/ * codice * /})(); // Ma questo funziona altrettanto bene

Problemi correlati