Javascript 绑定';这';关于余烬函数?

Javascript 绑定';这';关于余烬函数?,javascript,Javascript,我正试图更好地理解: 有人能解释一下“.bind(this)”在做什么,以及bind在这个特定实例中是如何工作的吗 编辑:经过一点思考和研究,以下是我对可能发生的事情的解释: 代码的“.then”部分无法访问“this”的原始上下文。“.bind(this)”将“.this”(在本例中是当前控制器对象)的值设置为“.then”函数中的“this” 如果删除“.bind(This)”部分,代码的“transitiono”部分将不起作用,这一事实可以证明这一点 另一方面,如果我们按照如下方式编写代码

我正试图更好地理解:

有人能解释一下“.bind(this)”在做什么,以及bind在这个特定实例中是如何工作的吗

编辑:经过一点思考和研究,以下是我对可能发生的事情的解释:

代码的“.then”部分无法访问“this”的原始上下文。“.bind(this)”将“.this”(在本例中是当前控制器对象)的值设置为“.then”函数中的“this”

如果删除“.bind(This)”部分,代码的“transitiono”部分将不起作用,这一事实可以证明这一点

另一方面,如果我们按照如下方式编写代码,则不需要使用 “.bind(this)”:


思想?

这正是正在发生的事情。如果您.bind(this),则不需要在函数外部为this创建别名。有关详细说明,请参阅

在余烬函数上绑定“this”时会发生什么

在您的示例中,
.bind()
不用于Ember函数。它用于常见的匿名函数(回调)。因此,你的问题与余烬无关

回调是指作为参数传递的匿名函数,而不是指定给对象的属性

这样的函数将绑定到
窗口
,即。e<代码>此函数将返回
窗口

访问外部范围的传统方法是将
赋值给外部范围中的变量,然后访问内部范围中的变量:

var _this = this;

someMethod(function() {
  console.log(this);  // => window
  console.log(_this); // => Outer scope
});
当您需要访问内部和外部范围时,这种方法是很好的。但是内部作用域中没有有用的内容,所以我们可以把它写得更短:

someMethod(function() {
  console.log(this); // Outer scope
}.bind(this));
.bind()
方法在anon函数的外部作用域中执行。它将函数绑定到外部作用域。因此,函数的内部作用域将与外部作用域相同,您可以像往常一样使用
这个
,就好像作用域没有改变一样

在CoffeeScript中,可以使用fat箭头停留在外部范围内:

_this = this

someMethod ->
  console.log this  # winodw
  console.log _this # Outer scope
someMethod=>
console.log此#外部范围
console.log`this`#您仍然可以像`this`一样访问窗口,这是双关语
在ES6中,您也可以使用胖箭头:

foo( () => {
  console.log(this);
});
请注意,尽管像在CoffeeScript中一样,胖箭头保持了外部范围,但它意味着一件不同的事情!在ES6中,胖箭头创建了一个无法拥有自己作用域的假函数

这一点很重要,因为有些库通过将回调应用到某个范围来与回调通信,并希望您对其执行
This.something()
。它不能与ES6 fat arrow一起使用(从技术上讲,它可以与Babel一起使用,因为Babel将ES6 fat arrow转换为传统功能,但您不应该依赖于此)


有关
.bind()
的更多信息,请参阅。

是的,您应该在文章底部添加答案(回答您自己的问题也可以)。
_this = this

someMethod ->
  console.log this  # winodw
  console.log _this # Outer scope
foo( () => {
  console.log(this);
});