2012-08-10 16 views
20

Me enteré del término oscurecimiento variable en Eloquent Javascript (Chapter 3), pero trato de entender un ejemplo preciso y básico del concepto.Un ejemplo de sombreado variable en javascript

¿Es este un ejemplo de sombreado?

var currencySymbol = "$"; 

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

showMoney("100");​ 
+0

Sí. También vea http://stackoverflow.com/questions/5373278/variable-shadowing-in-javascript?rq=1. –

Respuesta

18

Eso es también lo que se conoce como ámbito de las variables.

Una variable solo existe dentro de su función/método/clase que contiene, y anulará cualquier variable que pertenezca a un ámbito más amplio.

Es por eso que en su ejemplo, se mostrará un símbolo del euro, y no un dólar. (Porque el currencySymbol que contiene el dólar tiene un alcance más amplio (global) que el currencySymbol que contiene el símbolo del euro).

En cuanto a su pregunta específica: Sí, ese es un buen ejemplo de sombreado variable.

9

En la programación informática, ensombrecimiento variable aparece cuando una variable declarada dentro de un cierto alcance (bloque de decisión, el método o clase interna) tiene el mismo nombre que una variable declarada en un ámbito exterior. Se dice que esta variable externa está sombreada ...

así que creo que su ejemplo es bueno.

tiene una variable con nombre global que comparte el mismo nombre que el método interno. la variable interna se usará solo en esa función. Otras funciones sin esa declaración de variable usarán la global.

4

Sí, su ejemplo es un ejemplo de sombreado.

El sombreado persistirá también en otros escenarios debido a cómo funcionan los cierres en JavaScript. He aquí un ejemplo:

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 

Tenga en cuenta que en este caso, incluso cuando XCounter regresa, la función devuelve todavía tiene una referencia a su propia x y las invocaciones de que la función interna no tendrá efecto en los planos mundial, a pesar de que la el original se ha ido hace mucho tiempo fuera del alcance.

Cuestiones relacionadas