Tralasciamo per un attimo il contenuto della funzione MyFirstModule
e analizziamo il metodo con cui è stata definita. Non viene utilizzata la classica notazione function() { ... }
ma al suo posto viene utilizzata questa struttura:
var funzione = function() {
//definizione della classe
}()
La cosa interessante sono le parentesi tonde subito dopo la parentesi graffa di chiusura della classe. Questo significa che la funzione oltre ad essere chiamata viene invocata. Quindi in realtà dentro la variabile "funzione"
non è presente la funzione appena scritta, ma il suo risultato. Giusto per capire il concetto ecco un breve esempio relativo a questo approccio:
var firstFunction = function() {
return 10;
};
var secondFunction = function() {
return 10;
}();
alert(firstFunction);
alert(secondFunction);
Il primo alert stamperà il costrutto JavaScript "object"
mentre il secondo mostrerà il 10: questo perchè avendo aggiunto le parentesi alla fine, all'interno della variabile secondFunction
non viene salvata una funzione, bensì il suo risultato.
Analizzando la classe MyFirstModule
, notiamo anche la presenza di un return
all'interno della definizione, return
che permette di definire quali sono i membri pubblici. Tramite questo return
infatti è possibile ritornare (istantaneamente perché la funzione viene invocata subito) un oggetto che conterrà appunto i membri pubblici. Analizziamo questo sotto-aspetto con un nuovo esempio:
var function = function() {
return {
prop: "ciao",
method: function() { return "ciao" }
}
}();
var obj = function;
alert(obj.prop);
alert(prop.method);
Abbiamo semplicemente creato (ed invocato) una funzione che ritorna un particolare oggetto contenente una proprietà (prop
) e una funzione (method
).