2011-01-26 19 views
16

Ho spesso vedere espressioni come:javascript function vs. (function() {...}());

(function() { 
    var x = 1; 
    ... 
}()); 

Come posso interpretarlo? sintatticamente, questa è solo una definizione di funzione anonima.

function() { 
... 
} 

quale() dopo? e perché metterlo in allegato()?

Grazie

+0

@delnan: Hai ragione, ma penso che sia solo una di quelle domande che è un po 'difficile da cercare. Anche se scommetto che se una persona cerca * "Qual è la sintassi in javascript" *, troverà alcune risposte. : o) – user113716

+2

@delnan - Penso che potresti trovarti sul sito sbagliato. Questo è Stack Overflow, in cui le persone vengono per chiedere aiuto. Ti sei perso? Forse sei sul sito sbagliato, forse? – jmort253

+0

@delnan, presumo facendo questa domanda è anche l'apprendimento, ma non al livello che ti piace o ritenga appropriato. Ho provato a cercarlo, ma non ho ottenuto la risposta. e per questo, ringrazio @patrick per il tempo dedicato a rispondermi. – Oliver

risposta

24

Esattamente la stessa, eccetto che viene richiamato immediatamente dopo essere stati convertiti in un'espressione funzione.

// v-----first set of parentheses makes the function an expression 
    (function() { 
     var x = 1; 
     ... 
    }()); 
// ^-----this set is used to invoke the function 

stesso come se avete fatto:

var myfunc = function() { 
     var x = 1; 
     ... 
    }; 
    myfunc(); 

o (simile) questo:

var returnValue = function() { 
     var x = 1; 
     ... 
    }(); 

Sbarazzarsi dei nomi, spostare le parentesi intorno, e si può vedere che' non è diverso

+0

hmm, interessante. Credo di aver bisogno di approfondire il significato esatto di espressione e funzione invocando, molto. – Oliver

+1

@Oliver: ci sono alcune sottili ma importanti differenze tra le espressioni di funzione e le dichiarazioni. [Ecco un articolo davvero fantastico] (http://kangax.github.com/nfe/) sulle funzioni in js. – user113716

+0

grazie per l'articolo, buona lettura. risposta accettata – Oliver

2

L'area in cui più spesso lo trovo utile è nelle funzioni di callback. Questa notazione può essere utilizzata anche nei casi in cui è necessario includere una variabile in una funzione di callback, ma è necessario che lo stato della variabile non sia influenzato da ciò che accade al di fuori della funzione.

var someVal = 1; 

setTimeout((function(one) { 
     return function() { 
      alert(one); // alerts a 1 even 10 seconds after someVal++; 
     } 
})(someVal), 10000); 

someVal++; // the value in the setTimeout will remain the same as it is locked inside. 

In questo contesto, setTimeout accetta una funzione che non accetta argomenti. Quindi la domanda su come passare un valore a quella funzione viene risolta creando una funzione che accetta un argomento che restituisce una funzione che accetta 0 argomenti.

Suggerisco a chiunque voglia saperne di più sulla potenza di questa notazione per giocare con essa nella console JavaScript di Firebug. Una volta avvolto il concetto attorno a questo concetto, inizierai a vedere le aree in cui è possibile utilizzare questo potente concetto.

+0

cosa si chiama "IT"? Se fa così caldo, sicuramente deve avere un nome. –

+0

Penso che il termine che stai cercando sia una "chiusura". Ci sono molti altri usi per le chiusure, molte delle quali non ho ancora avuto l'opportunità di esplorare. – jmort253

+0

questo è quello che pensavo .. ma alcune ricerche veloci hanno tirato fuori molte informazioni apparentemente non correlate .. e qual è la differenza tra un 'chiusura' e un' clojure', mi chiedo? –

Problemi correlati