这是列表理解在coffeescript中泄漏变量名称的错误吗?

时间:2013-09-05 18:30:40

标签: javascript coffeescript list-comprehension

在学习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)。

1 个答案:

答案 0 :(得分:1)

来自fine manual

  

词汇范围和可变安全性

     

CoffeeScript编译器会确保在词法范围内正确声明所有变量 - 您永远不需要自己编写var

     

[一些示例代码]

     

注意所有变量声明如何在第一次出现时被推到最近的范围的顶部。

当你说:

for name ....

你隐含地声明了name变量,并且它将像任何其他变量一样被提升到范围的顶部。理解不是定义为函数或新范围,它碰巧使用function实现的事实只是一个实现细节(这仅仅是为了限制内部_i的范围,CoffeeScript用于实现理解的_len_ref_results个变量。)

所以你没有看到一个bug,你只是看到(Coffee | Java)Script中发生的通常变量提升。