脂肪箭头可以在不同的环境中使用,但它在某种程度上并不总是绑定到我想要的实例。
Answer 1:
脂肪箭头键合在3次
- 声明的方法时
- 方法中的声明一个函数时
- 宣布在全球范围内的函数时
1.当声明的方法
当CoffeeScript的编译器encouters类声明中的以下句法模式
class A
somemethod: (paramlist) =>
这将产生A类的构造函数中的以下代码
this.somemethod = __bind(this.somemethod, this);
这是该实例的定义与功能的结合版本覆盖初始分配
2.当声明的方法中的一个函数
当你的方法中定义与脂肪箭头的函数的CoffeeScript编译器自动创建一个封闭和和阴影此外方法的入变量_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();
};
};
函数的无脂肪的箭头A定义不创建封你。
3.委员会宣布在全球范围内的函数
如果你定义一个自由浮动的功能(指在一类,而不是在另一个函数/方法的方法)就这样
foo = => @bar
然后相应的JavaScript看起来像这样
var foo,
_this = this;
foo = function() {
return _this.bar;
};
有趣的事情在这里再次的是, 这是被分配到_ 这使foo的定义,关闭了这 _。
然而最重要的部分是, 这一直是你的执行环境的全球背景。 如果你是在浏览器中这将是窗口对象。 如果你正在运行的node.js这将是你是刚刚运行的模块。
警告:你不应该定义反正你的访问全球范围内的任何功能。 这需要麻烦。
文章来源: When does the “fat arrow” (=>) bind to “this” instance