在学习coffeescript时我发现了这个:
people = ("'#{name}'" for name in ['Foo', 'Bar', 'Baz'])
编译到此
(function() {
var name, people;
people = (function() {
var _i, _len, _ref, _results;
_ref = ['Foo', 'Bar', 'Baz'];
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
name = _ref[_i];
_results.push("'" + name + "'");
}
return _results;
})();
}).call(this);
这是一个可以在列表推导之外访问名称的错误吗? (我使用coffeescript 1.4.0)。
答案 0 :(得分:1)
来自fine manual:
词汇范围和可变安全性
CoffeeScript编译器会确保在词法范围内正确声明所有变量 - 您永远不需要自己编写
var
。[一些示例代码]
注意所有变量声明如何在第一次出现时被推到最近的范围的顶部。
当你说:
for name ....
你隐含地声明了name
变量,并且它将像任何其他变量一样被提升到范围的顶部。理解不是定义为函数或新范围,它碰巧使用function
实现的事实只是一个实现细节(这仅仅是为了限制内部_i
的范围,CoffeeScript用于实现理解的_len
,_ref
,_results
个变量。)
所以你没有看到一个bug,你只是看到(Coffee | Java)Script中发生的通常变量提升。