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