这是一个列表理解泄漏咖啡脚本中变量名称的错误吗?

Is this a bug that list comprehenstion leak a variable name in coffeescript?

本文关键字:变量名 脚本 咖啡 错误 泄漏 列表 一个      更新时间:2023-09-26

在学习咖啡脚本时,我发现:

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)。

来自精细手册:

词汇范围界定和变量安全

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

[一些示例代码]

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

当你说:

for name ....

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

所以你没有看到

一个错误,你只是看到(Coffee|Java)脚本。