范围与coffeescript不一致?

时间:2014-09-08 11:26:03

标签: coffeescript

我是coffeescript的初学者,我无法理解范围界定。我读过咖啡总是重新定义变量,以至于不可能泄漏任何东西。但请看下面的代码:

b = 2

bla = () ->
  a = 1
  b = 2
  null

a = 1

编译为

(function() {
  var a, b, bla;

  b = 2;

  bla = function() {
    var a;
    a = 1;
    b = 2;
    return null;
  };

  a = 1;

}).call(this);

因此,基本上在相同的范围内,ab完全相同的操作,结果是非常不同的。 b函数之外的bla泄露,a没有。{{1}}。这是一个错误还是一个我不明白的功能?

1 个答案:

答案 0 :(得分:2)

这是CoffeeScript的设计行为。

有关详细信息,请参阅CoffeeScript文档的Lexical Scoping and Variable Safety部分:

  

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

对于CofeeScript,它是一种正确的行为,因为它允许您使用在当前词法范围内可见的高级变量。

CoffeeScript缺少的是一种强制重新声明变量的方法。