[英]Why doesn't a method reference keep track of this?
我正在使用Babel转换ES2015类:
class Foo {
constructor(foo) {
this.foo = foo;
}
sayFoo() {
console.log(this.foo);
}
}
如果我说fooVar.sayFoo()
类的东西,这个类就像我期望的那样fooVar.sayFoo()
。 但是,如果我尝试将方法视为典型的JavaScript函数并将其作为参数传递( element.click(fooVar.sayFoo)
),当该方法实际运行其词法时, this
是事件对象,而不是Foo
的实例,所以this.foo
是未定义的。
相反,由于我指定了一个Foo
实例,我希望fooVar.sayFoo
绑定到fooVar
的值。 我必须编写一个额外的包装函数,以便按照我的预期工作。
我试图查看ES6规范,但无法弄清楚范围规则。 根据规范,这种奇怪的范围行为是否正确,或者它是某个地方的错误(例如,在巴别塔中)?
这是正确的行为,即使它看起来很奇怪吗?
是。 对于分配给prototype
属性的函数,方法或多或少具有语法糖。
只有箭头功能对待this
不同。
但是,您可以显式地将实例绑定到方法,而不是编写包装函数:
element.click(fooVar.sayFoo.bind(fooVar));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.