“如何逃离”;这";javascript类中的问题?

“如何逃离”;这";javascript类中的问题?,javascript,class,this,Javascript,Class,This,我有一个“this”问题,当我调用函数get_previsions时,我得到错误: 未捕获类型错误:this.get\u previsions不是一个函数。 这可能是因为(e)参数,因为当我执行console.log(this)时,它返回目标。我希望这个==我的班级。 感谢您的帮助在任何给定点,您都可以通过执行以下4条规则来检查当前的此引用所指向的内容: New:是否使用New调用函数,然后此指向新实例 显式绑定:是否使用函数#调用、函数#应用或函数#绑定 隐式绑定:该函数是否由其所有者调用?(

我有一个“this”问题,当我调用函数get_previsions时,我得到错误: 未捕获类型错误:this.get\u previsions不是一个函数。 这可能是因为(e)参数,因为当我执行console.log(this)时,它返回目标。我希望这个==我的班级。
感谢您的帮助

在任何给定点,您都可以通过执行以下4条规则来检查当前的
引用所指向的内容:

  • New:是否使用
    New
    调用函数,然后
    指向新实例
  • 显式绑定:是否使用
    函数#调用
    函数#应用
    函数#绑定
  • 隐式绑定:该函数是否由其所有者调用?(即
    owner.foo()
    owner[“bar”]()
  • 默认规则:如果没有其他规则发生,则
    如果脚本在
    模式下运行,则将
    设置为
    窗口
    对象,否则
    未定义
  • 事件侦听器使用显式绑定(
    callBack.call(target,…)
    )调用函数,以便将
    引用设置为目标。要更改
    引用,您需要将其包装并隐式调用,或者使用
    函数#bind

    隐式调用示例(+闭包):

    显式调用示例(函数#bind):


    我假设您有一个定义类似于的类

    var something = {
      foo: function() {
        addEventListener("click", this.bar.bind(this));
      },
      bar: function() {
    
      }
    };
    
    你有几个选择。第一个选项,您可以将所有函数绑定到构造函数中的
    this

    class thing {
      get_O3(e) { ... },
      get_previsions() { ... }
    }
    
    这可能会变得很尴尬,尤其是当您有许多函数时。您可以编写一个helper
    bindAll
    函数,但一个不那么麻烦/冗长的解决方案是使用工厂方法,完全绕过

    class thing {
      constructor () {
        this.get_03 = this.get03.bind(this);
        this.get_previsions = this.get_previsions.bind(this);
      }
      get_O3(e) { ... },
      get_previsions() { ... }
    }
    

    如果您想更深入地了解该主题,请阅读一些相关书籍。

    我的意思是“这”指的是局部范围,我不确定问题是什么。“获取”功能在哪里?为什么不简单地将其设为func get_provisions(),然后从get_03函数内部调用get_provisions()。或者,您可以将“this”作为参数传递到get_03函数中,方法是执行类似get_03(e,_this)的操作,然后执行_this.get_规定。我假设e.preventDefault是通过点击按钮调用的?我不知道你为什么认为
    this.get\u previsions
    应该存在。我们看不到您在哪里定义
    get\u previsions
    ,也看不到您如何调用
    get\u O3
    (这将决定此
    的值是多少)。您需要在
    thing
    的实例上提供.what's
    this.bind
    ?bind()方法创建一个新函数,将其
    this
    关键字设置为第一个参数中的值。从
    构造函数
    函数调用,
    bind
    确保
    的所有实例都引用已创建的实例。您正在谈论
    函数#bind
    ,但您正在尝试使用未定义的
    thing#bind
    this.get_03=this.get03.bind(this)D'oh。谢谢更正。@Dudy83两种方法都可以。此外,如果答案对您有帮助,您可以通过单击其左侧的复选标记来接受它。
    
    class thing {
      get_O3(e) { ... },
      get_previsions() { ... }
    }
    
    class thing {
      constructor () {
        this.get_03 = this.get03.bind(this);
        this.get_previsions = this.get_previsions.bind(this);
      }
      get_O3(e) { ... },
      get_previsions() { ... }
    }
    
    function makeThing {
      const thing = {
        get_O3(e) {
          ...
          thing.get_previsions();
        },
        get_previsions() { ... }
      };
      return thing;
    }