Il modo in cui solitamente lo spiego alle persone è mostrare come è simile ad altri pattern JavaScript.
In primo luogo, si dovrebbe sapere che ci sono due modi per dichiarare una funzione (in realtà, c'è almeno cinque, ma questi sono i due principali colpevoli):
function foo() {/*code*/}
e
var foo = function() {/*code*/};
Anche se questa costruzione sembra strana, probabilmente la si utilizza sempre durante il collegamento di eventi:
Si dovrebbe notare che la seconda forma non è molto diverso da una dichiarazione di variabile normale:
var bar = 5;
var baz = 'some string';
var foo = function() {/*code*/};
Ma in JavaScript, si ha sempre la scelta tra l'utilizzo direttamente o tramite una variabile un valore. Se bar
è 5
, quindi i prossimi due dichiarazioni sono equivalenti:
var myVal = bar * 100; // use 'bar'
var myVal = 5 * 100; // don't use 'bar'
Beh, se è possibile utilizzare 5
da solo, perché non si può utilizzare function() {\*code*\}
da solo troppo? In effetti, puoi. E questa è chiamata funzione anonima.Quindi questi due esempi sono ugualmente uguali:
var foo = function() {/*code*/}; // use 'foo'
foo();
(function(){/*code*/}()); // don't use 'foo'
L'unica differenza che dovresti vedere è nelle parentesi aggiuntive. Questo è semplicemente perché se si avvia una linea con la parola chiave function
, il parser penserà che si sta dichiarando una funzione utilizzando il primo modello all'inizio di questa risposta e si genera un'eccezione di errore di sintassi. Quindi avvolgi tutta la tua funzione anonima all'interno di un paio di parentesi graffe e il problema scompare.
In altre parole, le seguenti tre affermazioni sono valide:
5; // pointless and stupid
'some string'; // pointless and stupid
(function(){/*code*/}()); // wonderfully powerful
sei interessato a una "spiegazione formale", in termini di specifiche ECMA-262? – CMS
Leggi informazioni sullo [scopo di questo costrutto] (http://stackoverflow.com/q/592396/1048572). Dai un'occhiata a una spiegazione [tecnica] non tecnica (http://stackoverflow.com/q/8228281/1048572), anche [qui] (http://stackoverflow.com/a/441498/1048572). Per la sintassi, vedere [perché le parentesi sono necessarie] (http://stackoverflow.com/q/1634268/1048572) e [dove dovrebbero andare] (http://stackoverflow.com/q/3384504/1048572) . – Bergi