Questo brevissimo articolo potrebbe essere sicuramente un addendum ad un mio precedente articolo.
La tecnica dei “namespace anonimi” (il nome credo di averlo appena inventato e mi scuso se non fosse formalmente correttissimo) è utile nel caso si volesse aggiungere uno snippet di codice JavaScript all’interno di un template per fare una cosa molto specifica che non merita di essere inserita all’interno dei file JavaScript di tutta l’applicazione. Ne ho avuto bisogno recentemente quando ho dovuto far scomparire un campo di una form se il valore di una certa SELECT non fosse impostato. Avevo bisogno di una variable di appoggio, ma ovviamente non volevo che questa finisse nell’oggetto globale.
Senza indugiare oltre, ecco il codice (l’ho diviso in tre passi per chiarezza espositiva):
/* Passo 1.
Definiamo una funzione anonima per creare un namespace;
è necessario racchiudere la definizione all'interno di una coppia
di parentesi, o il parser JavaScript darebbe errore */
(function() {
});
/* Passo 2.
Inseriamo all'interno del nostro "namespace" il codice che ci
interessa eseguire. Si noti che la variable $s in questo modo
non è globale ma rimane chiusa nel namespace (che era quello
che volevamo ottenere) */
(function() {
var $s = $('#generatingActionId');
if ($s.val() == '') {
$('#generatingActionRef-label').hide();
}
});
/* Passo 3.
Infine "attiviamo" il nostro codice, eseguendo la funzione anonima;
notare la coppia di parentesi direttamente alla fine della definizione
della funzione */
(function() {
var $s = $('#generatingActionId');
if ($s.val() == '') {
$('#generatingActionRef-label').hide();
}
})();
5 Responses to “Namespace anonimi in JavaScript”
Da buon geek sono corso al codice e ci ho messo un po’ a capire che erano tre passi distinti (sì, poi ho letto con maggior attenzione sopra e l’ho capito). Magari potresti inserire nel commento “Passo 1″, “Passo 2″, “Passo 3″ per i “gatti frettolosi” come me :-)
E va bene… ti ho accontentato ;)
La divisione in tre passi mi confonde :-P
Comunque, e’ lo stesso che fare questo?
new function() { alert(“Ciao namespace anonimo”); }();
Enos, sì funziona anche così ma secondo me è un pochino più criptico e *forse* un pochino più pesante (quisquilie) :) Nel tuo caso tu stai usando una definizione literal di una funzione come costruttore di un oggetto, mentre nel mio caso no (io sono più anonimo di te ;)).
Prova a vedere:
alert(typeof(new function(){}())); // tuo esempio (object)
alert(typeof((function(){})())); // mio esempio (undefined)
Per capire ho dovuto scavare fino in fondo, ma ora il mio kung-fu è più forte.
(new Function(‘alert(“Grazie Claudio”)’))();
Additional comments powered by BackType