我是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);
因此,基本上在相同的范围内,a
和b
完全相同的操作,结果是非常不同的。 b
函数之外的bla
泄露,a
没有。{{1}}。这是一个错误还是一个我不明白的功能?
答案 0 :(得分:2)
这是CoffeeScript的设计行为。
有关详细信息,请参阅CoffeeScript文档的Lexical Scoping and Variable Safety部分:
注意所有变量声明是如何被推送到的 最近的范围的顶部,它们第一次出现。
对于CofeeScript,它是一种正确的行为,因为它允许您使用在当前词法范围内可见的高级变量。
CoffeeScript缺少的是一种强制重新声明变量的方法。