Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Da variabile globale a privata

Link copiato negli appunti

Questo post prende spunto da una domanda che ho trovato su Stackoverflow.

Vorrei che si lasciasse perdere per un momento il fatto che cià che vuole fare lo sviluppatore è sbagliato sotto molti punti di vista (viola per esempio l'incapsulamento e usa variabili non dichiarate, quindi globali). Soffermiamoci invece sul perché cià che ha fatto funziona.

Riassumendo brevemente il problema: uno sviluppatore, in Javascript, vuole creare un oggetto facendo in modo che quest'ultimo lavori su una variabile privata, definita al di fuori dell'oggetto. Lo sviluppatore aveva già , a suo dire, risolto utilizzando eval e ha voluto dimositrarlo con il seguente codice:

var AObject={
 get:function(s){
        return s.toLowerCase()+a;
    }
}
function temp(){
    var a="A";
    var o={};
    eval("o.get="+AObject.get.toString());
    return o;
}
var BObject=temp();
BObject.get("B");    // "bA"

Quando ho visto la funzione non ho capito immediatamente come funzionasse: com'è possibile che una variabile globale diventi di colpo privata? Ho dunque deciso di investigare.

Ho pensato che la funzione eval viene eseguita nel contesto corrente, per cui si può sostituire con il codice che essa esegue. Applicando la mia tesi il codice di prima diventa questo:

var AObject={
 get:function(s){
        return s.toLowerCase()+a;
    }
}
function temp(){
    var a="A";
    var o={};
    o.get=function(s){
        return s.toLowerCase()+a;
    };
    return o;
}
var BObject=temp();
BObject.get("B");    // "bA"

Da qui è più evidente il perché la variabile a viene risolta, nonostante sia dichiarata esternamente all'oggetto AObject: la variabile a è infatti visibile nella closure che copia il metodo get di AObject.

Sia ben chiaro però che non si sta realmente usando la funzione get di AObject, ma una copia, che lavora non su AObject ma all'interno della funzione temp.

Credo che perdere qualche minuto per osservare del codice "magico" a volte sia molto istruttivo, poiché permette di entrare nella mentalità  (passatemi il termine) di un linguaggio.

In questo caso per capire il codice bisogna infatti conoscere come lavora eval e come lavorare con le closure.

Voi che ne pensate? Vi fermate mai a sviscerare una funzione "magica" quando la incontrate?

Ti consigliamo anche