2012-03-26 18 views
6

Estoy intentando comprender cómo se definen las variables de CoffeeScript. según la documentación:Confusión sobre el ámbito de variable de CoffeeScript

Este comportamiento es efectivamente idéntico al alcance de Ruby como variables locales.

Sin embargo, descubrí que funciona de manera diferente.

En CoffeeScript

a = 1 
changeValue = -> a = 3 
changeValue() 
console.log "a: #{a}" #This displays 3 

En Rubí

a = 1 
def f 
    a = 3 
end 
puts a #This displays 1 

Puede alguien explicar, por favor?

Respuesta

8

Variables locales de Ruby (comenzando por [a-z_]) are really local to the block they are declared in. Entonces, el comportamiento de Ruby que publicaste es normal.

En el ejemplo de su café, tiene un closure haciendo referencia a. No es una declaración de función.

En el ejemplo de Ruby, no tiene un cierre sino una declaración de función. Esto es diferente. El Rubí equivalente a su café es:

a = 1 
changeValue = lambda do 
    a = 3 
end 
changeValue() 

En los cierres, las variables locales presentes cuando se declara el bloque son todavía accesibles cuando se ejecuta el bloque. ¡Este es (uno de los) poderes de cierres!

+0

Ahora entiendo. Gracias. –

0

La variable a que se utiliza dentro de la función changeValue es la variable global a. Que CoffeeScript será compilado en el siguiente JavaScript:

var a, changeValue; 
a = 1; 
changeValue = function() { 
    return a = 3; 
}; 
changeValue(); 
console.log("a: " + a); 

Para que changeValue para no alterar la variable a (es decir, utilizar una variable local), que le sea necesario tener un argumento a la función llamada a (que crearía una variable como local para esa función) o declarar a como una variable local dentro de la función usando var a = 3; (no estoy seguro de lo que sería el CoffeeScript para eso, no soy un tipo de CoffeeScript).

Some examples of JavaScript variable scope.

+1

Entiendo el caso de JavaScript. Pero en CoffeeScript, creo que la variable local siempre debe sombrear la variable global porque cuando defino una función, no puedo considerar todas las variables globales. –

Cuestiones relacionadas