Javascript 为什么';方法参考不跟踪这一点吗?
我正在使用Babel传输ES2015类:Javascript 为什么';方法参考不跟踪这一点吗?,javascript,class,ecmascript-6,Javascript,Class,Ecmascript 6,我正在使用Babel传输ES2015类: class Foo { constructor(foo) { this.foo = foo; } sayFoo() { console.log(this.foo); } } 如果我说类似于fooVar.sayFoo()的话,这个类的工作原理与我期望的完全一样。但是,如果我尝试将该方法视为典型的JavaScript函数,并将其作为参数传递(元素.click(fooVar.sayFoo)),
class Foo {
constructor(foo) {
this.foo = foo;
}
sayFoo() {
console.log(this.foo);
}
}
如果我说类似于fooVar.sayFoo()
的话,这个类的工作原理与我期望的完全一样。但是,如果我尝试将该方法视为典型的JavaScript函数,并将其作为参数传递(元素.click(fooVar.sayFoo)
),当该方法实际运行其词法时,this
是事件对象,而不是Foo
的实例,因此this.Foo
是未定义的
相反,由于我指定了Foo
的一个实例,我希望fooVar.sayFoo
绑定到fooVar
的值。我必须为它编写一个额外的包装函数,才能像我期望的那样工作
我试图查看ES6规范,但无法找出范围规则。根据规范,这种奇怪的作用域行为是正确的,还是某个地方(例如,在巴别塔)有缺陷
这是正确的行为吗,尽管看起来很奇怪
对。对于分配给prototype
属性的函数,方法或多或少是语法上的糖类
只有箭头函数对该的处理方式不同
但是,您可以显式地将实例绑定到方法,而不是编写包装函数:
element.click(fooVar.sayFoo.bind(fooVar));
另请参见这里没有魔法,函数的
此
值取决于执行上下文,即它如何调用,而不是如何定义,始终与ES2015无关。当引用这样的函数时,元素被设置为this
值。您不必编写额外的包装函数,您可以使用bindelement。单击(fooVar.sayFoo.bind(fooVar))
@adeneo,因为整个“类”系统都是新的,我期望表达式fooVar.sayFoo
已经绑定到fooVar
——在我看来,Joseph发布的替代方案应该是自动行为。我将把这归因于更多的JavaScript特性;谢谢。类与否并不重要,Babel可能会将其转换为对象文字,但执行上下文仍然是设置这个值的因素,任何其他因素都会破坏互联网,只要想想所有带有引用函数的事件处理程序就会停止工作。类系统并不是那么新,我认为这主要是在旧原型的基础上加上句法上的糖分。