我试图了解CoffeeScript变量的范围。 根据文件:
这种行为实际上与Ruby的本地范围相同 变量
然而,我发现它的工作方式不同。
在CoffeeScript中
a = 1
changeValue = -> a = 3
changeValue()
console.log "a: #{a}" #This displays 3
在Ruby中
a = 1
def f
a = 3
end
puts a #This displays 1
有人可以解释一下吗?
答案 0 :(得分:8)
Ruby的局部变量(以[a-z_]开头)are really local to the block they are declared in。所以你发布的Ruby行为是正常的。
在您的咖啡示例中,您有closure引用a。这不是功能声明。
在Ruby示例中,您没有闭包而是函数声明。这是不同的。与您的咖啡相当的Ruby是:
a = 1
changeValue = lambda do
a = 3
end
changeValue()
在闭包中,当块被执行时,仍然可以访问声明块时出现的局部变量。这是封闭的(其中一种)权力!
答案 1 :(得分:0)
a
函数中使用的changeValue
变量是全局a
变量。 CoffeeScript将编译为以下JavaScript:
var a, changeValue;
a = 1;
changeValue = function() {
return a = 3;
};
changeValue();
console.log("a: " + a);
为了使changeValue
不改变a
变量(即使用局部变量),您需要为名为a
的函数创建一个参数(这将创建a作为该函数的局部变量)或使用a
将var a = 3;
声明为函数内部的局部变量(不确定CoffeeScript的用途是什么,我不是CoffeeScript的人)。< / p>