2012-08-10 17 views
20

Ho saputo del termine ombreggiamento variabile in Eloquent Javascript (Chapter 3), ma sto cercando di capire un esempio preciso e di base del concetto.Un esempio di ombreggiamento variabile in javascript

È un esempio di ombreggiamento?

var currencySymbol = "$"; 

function showMoney(amount) { 
    var currencySymbol = "€"; 
    document.write(currencySymbol + amount); 
} 

showMoney("100");​ 
+0

Sì. Vedi anche http://stackoverflow.com/questions/5373278/variable-shadowing-in-javascript?rq=1. –

risposta

18

Questo è anche ciò che è noto come portata variabile.

Una variabile esiste solo all'interno della sua funzione/metodo/classe che contiene e sostituisce qualsiasi variabile che appartiene a un ambito più ampio.

Ecco perché nel tuo esempio verrà mostrato un euro e non un dollaro. (Poiché lo currencySymbol contenente il dollaro ha un ambito più ampio (globale) rispetto allo currencySymbol contenente il simbolo dell'euro).

Come per la tua domanda specifica: Sì, questo è un buon esempio di ombreggiamento variabile.

9

Nella programmazione di computer, shadowing variabile si verifica quando una variabile dichiarata entro un certo campo di applicazione (blocco di decisione, metodo o classe interna) ha lo stesso nome di una variabile dichiarata in un ambito esterno. Si dice che questa variabile esterna sia ombreggiata ...

quindi credo che il tuo esempio sia buono.

si dispone di una variabile denominata globalmente che condivide lo stesso nome del metodo interno. la variabile interna sarà usata solo in quella funzione. Altre funzioni senza quella dichiarazione di variabile useranno quella globale.

4

Sì, il tuo esempio è un esempio di ombreggiamento.

Lo shadowing persisterà anche in altri scenari a causa di come le chiusure funzionano in JavaScript. Ecco un esempio:

var x = -1; 
function xCounter() { 
    var x = 0; 
    return function() { 
     ++x; 
     return x; 
    }; 
} 

console.log(x); // -1 
counter = xCounter(); 
console.log(counter()); // 1 
console.log(counter()); // 2 
console.log(x); // still -1, global was never touched 

nota che in questo caso, anche quando torna xCounter, la funzione restituisce ancora ha un riferimento alla propria x e invocazioni di quella funzione interna non hanno alcun effetto sul globale, anche se il l'originale è da tempo fuori portata.