我正在使用 Babel 来转译 ES2015 类:
class Foo {
constructor(foo) {
this.foo = foo;
}
sayFoo() {
console.log(this.foo);
}
}
如果我说这样的话,这个课程的效果就完全符合我的预期fooVar.sayFoo()
。但是,如果我尝试将该方法视为典型的 JavaScript 函数并将其作为参数传递(element.click(fooVar.sayFoo)
),当该方法实际运行其词法时this
是事件对象,而不是实例Foo
, 所以this.foo
未定义。
相反,因为我指定了一个实例Foo
, 我期望fooVar.sayFoo
与 的值绑定fooVar
。我必须编写一个额外的包装函数才能使其按我的预期工作。
我尝试查看 ES6 规范,但无法弄清楚范围规则。根据规范,这种奇怪的作用域行为是否正确,或者是某个地方的错误(例如,在 Babel 中)?
尽管看起来很奇怪,但这是正确的行为吗?
是的。方法或多或少是分配给函数的语法糖prototype
特性。
只有箭头函数处理this
不同。
但是,您可以将实例显式绑定到方法,而不是编写包装函数:
element.click(fooVar.sayFoo.bind(fooVar));
也可以看看如何在回调中访问正确的“this”/上下文? https://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)