粗箭头绑定3次
- 声明方法时
- 在方法内声明函数时
- 在全局上下文中声明函数时
1.声明方法时
当 Coffeescript 编译器遇到以下语法模式时
在类声明中
class A
somemethod: (paramlist) =>
这将在类 A 的构造函数中产生以下代码
this.somemethod = __bind(this.somemethod, this);
也就是说该实例的定义将覆盖初始分配
具有函数的绑定版本
2. 在方法内声明函数时
当您在方法中定义带有粗箭头的函数时,Coffeescript 编译器
自动创建闭合和阴影this将外部方法放入变量中_this。任何参考@在内部函数中将使用变量_this在生成的 javascript 代码中
somemethod: ->
=> @someCall()
这是对应的Javascript
A.prototype.somemethod = function() {
//_this references this
var _this = this;
return function() {
//and _this is now used within the inner function
return _this.someCall();
};
};
没有粗箭头的函数定义不会为您创建该闭包。
3. 在全局上下文中声明函数时
如果您定义一个自由浮动函数(意味着作为类中的方法而不是另一个函数/方法中的方法),就像这样
foo = => @bar
那么相应的Javascript就会是这样的
var foo,
_this = this;
foo = function() {
return _this.bar;
};
有趣的是this正在分配给 _this这使得能够定义foo关闭 _this.
然而重要的是this始终是执行环境的全局上下文。如果您在浏览器中,它将是窗口对象。如果您正在运行node.js,它将是您刚刚运行的模块。
Warning:无论如何,您不应该定义任何访问全局上下文的函数。这会带来麻烦。