пожалуйста помогите получить ответ я не могу понять, почему контекст теряется после определения
class A {
func() {
console.log(this)
}
}
let a = new A();
let b = a.func;
b();
Вы можете обратиться к это, чтобы прояснить свои сомнения.
Просто это коротко, если вы вызываете функцию для объекта, javascript считает этот объект своим this/context.
например.
let obj = {
key : 'value',
fun : function(){
}
}
// if called like obj.fun() --> obj is going to be this
// if called like let ffun = obj.fun; ffun(); ---> window/global object is going to be this
Если вы вызываете этот метод с помощью call/apply/bind, вам необходимо указать пользовательский контекст в качестве первого параметра для этих методов.
//if call like obj.fun.call(someObject, p1, p2)
// Or obj.fun.apply(someObject, [p1, p2])
// Or let ffun = obj.fun.bind(someObject, [p1, p2]); ffun();
// someObject is going to be this in all these 3 cases
В других случаях, когда функция вызывается напрямую, она принимает оконный/глобальный объект в качестве своего контекста.
Как сказал @junvar в комментариях, вы должны привязать функцию к this
.
Вы можете сделать это, например, в конструкторе:
class A {
constructor(){
this.func = this.func.bind(this)
}
func() {
console.log(this)
}
}
let a = new A();
let b = a.func;
b();
Это просто преднамеренное поведение JS по умолчанию. Если вы хотите сохранить контекст функции, для этой цели доступен метод
bind
. Например.let b = a.func.bind(a)
.