“如何逃离”;这";javascript类中的问题?
我有一个“this”问题,当我调用函数get_previsions时,我得到错误: 未捕获类型错误:this.get\u previsions不是一个函数。 这可能是因为(e)参数,因为当我执行console.log(this)时,它返回目标。我希望这个==我的班级。“如何逃离”;这";javascript类中的问题?,javascript,class,this,Javascript,Class,This,我有一个“this”问题,当我调用函数get_previsions时,我得到错误: 未捕获类型错误:this.get\u previsions不是一个函数。 这可能是因为(e)参数,因为当我执行console.log(this)时,它返回目标。我希望这个==我的班级。 感谢您的帮助在任何给定点,您都可以通过执行以下4条规则来检查当前的此引用所指向的内容: New:是否使用New调用函数,然后此指向新实例 显式绑定:是否使用函数#调用、函数#应用或函数#绑定 隐式绑定:该函数是否由其所有者调用?(
感谢您的帮助在任何给定点,您都可以通过执行以下4条规则来检查当前的
此
引用所指向的内容:
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() { ... }
}
这可能会变得很尴尬,尤其是当您有许多函数时。您可以编写一个helperbindAll
函数,但一个不那么麻烦/冗长的解决方案是使用工厂方法,完全绕过此
:
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'sthis.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;
}