Javascript 为什么';方法参考不跟踪这一点吗?

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)),

我正在使用Babel传输ES2015类:

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
值。您不必编写额外的包装函数,您可以使用bind
element。单击(fooVar.sayFoo.bind(fooVar))
@adeneo,因为整个“类”系统都是新的,我期望表达式
fooVar.sayFoo
已经绑定到
fooVar
——在我看来,Joseph发布的替代方案应该是自动行为。我将把这归因于更多的JavaScript特性;谢谢。类与否并不重要,Babel可能会将其转换为对象文字,但执行上下文仍然是设置
这个
值的因素,任何其他因素都会破坏互联网,只要想想所有带有引用函数的事件处理程序就会停止工作。类系统并不是那么新,我认为这主要是在旧原型的基础上加上句法上的糖分。