在 CoffeeScript / JS 中将函数分配给 vars
Assigning functions to vars in CoffeeScript / JS
以下 CoffeeScript:
greet = -> "This is an example of a function"
编译时生成以下 JavaScript 代码:
(function() {
var greet;
greet = function() {
return "This is an example of a function";
};
}).call(this);
我的问题是,为什么 JavaScript 不能像这样只创建一个函数:
(var greet = function() {
return "This is an example of a function"
};
}).call(this);
这是因为 CoffeeScript 的实现方式 lexical scoping。首先,默认情况下,CoffeeScript 转译器会将输出 JavaScript 包装在一个匿名函数中,以使其远离全局命名空间(尽管可以禁用此行为)。这就是外部函数的原因(如果你要编写更多的 CoffeeScript 代码,那么它最终将在 JS 中的一个匿名函数中结束)。
其次,CoffeeScript 转译器将自动声明在范围顶部使用的所有变量(同样,如果您在 CoffeeScript 中使用更多 top-level 变量,那么它们将在顶部声明为 greet
; 如果你只在内部函数内部使用任何变量,那么它们也会在内部函数中声明,而不是在更大范围的外部。
以下 CoffeeScript:
greet = -> "This is an example of a function"
编译时生成以下 JavaScript 代码:
(function() {
var greet;
greet = function() {
return "This is an example of a function";
};
}).call(this);
我的问题是,为什么 JavaScript 不能像这样只创建一个函数:
(var greet = function() {
return "This is an example of a function"
};
}).call(this);
这是因为 CoffeeScript 的实现方式 lexical scoping。首先,默认情况下,CoffeeScript 转译器会将输出 JavaScript 包装在一个匿名函数中,以使其远离全局命名空间(尽管可以禁用此行为)。这就是外部函数的原因(如果你要编写更多的 CoffeeScript 代码,那么它最终将在 JS 中的一个匿名函数中结束)。
其次,CoffeeScript 转译器将自动声明在范围顶部使用的所有变量(同样,如果您在 CoffeeScript 中使用更多 top-level 变量,那么它们将在顶部声明为 greet
; 如果你只在内部函数内部使用任何变量,那么它们也会在内部函数中声明,而不是在更大范围的外部。