1

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

这是一个可以在列表理解之外访问名称的错误吗?(我使用的是咖啡脚本 1.4.0)。

4

1 回答 1

1

来自精美手册

词法作用域和变量安全

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

[一些示例代码]

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

当你说:

for name ....

您正在隐式声明该name变量,并且它将像任何其他变量一样被提升到范围的顶部。推导式没有被定义为一个函数或一个新的作用域,它碰巧使用 a 实现的事实只是function一个实现细节(这只是为了限制CoffeeScript 用来实现理解)。_i_len_ref_results

所以你没有看到错误,你只是看到了在 (Coffee|Java)Script 中发生的通常的变量提升。

于 2013-09-05T18:47:23.840 回答