关于CoffeeScript变量范围的困惑

Sam*_*ong 6 ruby scope coffeescript

我试图了解CoffeeScript变量的范围.根据文件:

这种行为实际上与Ruby的局部变量范围相同.

但是,我发现它的工作方式不同.

在CoffeeScript中

a = 1
changeValue = -> a = 3
changeValue()
console.log "a: #{a}" #This displays 3
Run Code Online (Sandbox Code Playgroud)

在Ruby中

a = 1
def f
  a = 3
end
puts a #This displays 1
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

Bla*_*sad 8

Ruby的局部变量(以[a-z_]开头)实际上是声明它们的块的本地变量.所以你发布的Ruby行为是正常的.

在你的Coffee示例中,你有一个引用a 的闭包.这不是一个功能声明.

在Ruby示例中,您没有闭包而是函数声明.这是不同的.与您的咖啡相当的Ruby是:

a = 1
changeValue = lambda do
   a = 3
end
changeValue()
Run Code Online (Sandbox Code Playgroud)

在闭包中,当块被执行时,仍然可以访问声明块时出现的局部变量.这是封闭的力量之一!