…… 身为 JavaScript 程序员的好友说,对 javascript 的不满之一,就是它的变量声明和作用域。 —— Mats
JavaScript
js 可以通过有无var
来选择是否创建一个新的作用域:
var a = "out";(function() { var a = "in";})();alert( a );// "out"
a = "out";(function() { a = "in";})();alert( a );// "in"
很灵活。不幸的是,不小心漏写最外层 var
之后,变量有可能会变成全局变量,这是容易滋生 bug 的地方。
CoffeeScript
CoffeeScript 中统一去掉了var
,全部按局部变量处理,和 js 不同的是,不再创建内层作用域了。
a = "out"(() -> a = "in")()alert( a )// "in"
Ruby
# version 1a = "out"(lambda do a = "in"end).callputs a#=> "in"
# version 2# ruby 1.9+a = "out"1..2.each do |i; a| #<= 注意这里的分号 a = "in"endputs a#=> "out"
Ruby 中默认和 CoffeeScript 一致,使用外层作用域。但多了一种“作用域声明”,允许人工制定创建一个作用域。
结论
本文出自:http://q.pnq.cc, 原文地址:http://q.pnq.cc/blog/2014/03/18/variable-scope-in-js-coffeescript-and-ruby/, 感谢原作者分享。 任何业绩的质变都来自于量变的积累。