关于CoffeeScript变量范围的困惑

时间:2012-03-26 01:40:32

标签: ruby coffeescript scope

我试图了解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

有人可以解释一下吗?

2 个答案:

答案 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作为该函数的局部变量)或使用avar a = 3;声明为函数内部的局部变量(不确定CoffeeScript的用途是什么,我不是CoffeeScript的人)。< / p>

Some examples of JavaScript variable scope.