Javascript ES6:如何从回调函数调用类函数

Javascript ES6:如何从回调函数调用类函数,javascript,ecmascript-6,this,es6-class,Javascript,Ecmascript 6,This,Es6 Class,我有一个类,在init方法中,我正在设置一个click事件,在该事件中,我想调用该类上的一个方法,但我不知道如何做,或者是否可能。下面的代码显示了我正在尝试的内容的结构。在classes init()函数中,在ajax返回后,我将设置一个click事件,并在该回调中调用该类的classFn()函数。我试过绑定这个,我试过self=this和binding-that,箭头函数(我没想到会起作用,但我想我会试试),等等 您需要绑定回调函数并像this.classFn()那样调用。您可以使用.bind

我有一个类,在init方法中,我正在设置一个click事件,在该事件中,我想调用该类上的一个方法,但我不知道如何做,或者是否可能。下面的代码显示了我正在尝试的内容的结构。在classes init()函数中,在ajax返回后,我将设置一个click事件,并在该回调中调用该类的classFn()函数。我试过绑定这个,我试过self=this和binding-that,箭头函数(我没想到会起作用,但我想我会试试),等等


您需要绑定回调函数并像
this.classFn()
那样调用。您可以使用
.bind
箭头功能

class MyClass {
  constructor() {
   this.a = '';
   this.init = this.init.bind(this);
  }

  init() {
    ....
    $.getJSON(url, function(data) {
      $(mySelector).click(function() {
        this.classFn();
      }.bind(this));
    }.bind(this));
  }

  classFn() {
    ....
  }
}


功能
更改此的含义。解决此问题的一种方法是使用
bind
。但是,您必须使用它两次,因为您有两层
函数
。解决此问题的一个简单方法是使用箭头函数,它不会改变此:

class MyClass {
  constructor() {
   this.a = '';
  }

  init() {
    ....
    $.getJSON(url, (data) => {
      $(mySelector).click(() => {
        this.classFn();
      });
    });
  }

  classFn() {
    ....
  }
}

代码中的“我想调用类上的方法”是一个实例方法,而不是类方法。你能澄清一下吗?另一种可能是将“this”赋值给一个不会改变的新变量<代码>var self=此然后在回调内部使用
self.myFunct()@Occam'sRazor,我在编辑答案时看到了箭头功能不起作用。我把bind放在了多个地方,效果很好。这就是我所缺少的:多重绑定。一旦它开始工作,我想从内到外将它们转换为箭头函数。但第一次失败了。在事件回调中,它仍然绑定到单击的元素。当一个箭头函数被用作函数参数时,“词汇上的环绕代码”可能不是我们所认为的吗?我还发现,将该方法设为静态并使用MyClass.classFn()调用它也可以。@kombat啊,不,这与“词汇化的周边代码”无关。这是因为jQuery确保
bind
您作为回调函数提供的函数,以便
this
(或
$(this)
)引用元素。参见例如(底部的示例部分)My bad。
class MyClass {
  constructor() {
   this.a = '';
  }

  init = ()  => {   // class fields are stage-2 proposal with es6
    ....
    $.getJSON(url,(data) =>  {
      $(mySelector).click(()  => {
        this.classFn();
      });
    });
  }

  classFn() {
    ....
  }
}
class MyClass {
  constructor() {
   this.a = '';
  }

  init() {
    ....
    $.getJSON(url, (data) => {
      $(mySelector).click(() => {
        this.classFn();
      });
    });
  }

  classFn() {
    ....
  }
}