Почему после определения некоторого метода из объекта в переменную контекст теряется? - PullRequest
1 голос
/ 22 мая 2019

помогите пожалуйста получить ответ я не могу понять, почему контекст потерян после определения

    class A {
    	func() {
    		console.log(this)
    	}
    }
    
    let a = new A();
    let b = a.func;
    b();

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Вы можете сослаться на this , чтобы прояснить ваше сомнение.

Упростите это краткое, если вы вызываете функцию для объекта, javascript считает этот объект своим контекстом.

например.

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

В противном случаеслучаи, когда функция вызывается напрямую, она принимает оконный / глобальный объект в качестве контекста.

0 голосов
/ 22 мая 2019

Как сказал @junvar в комментариях, вы должны привязать функцию к this.Вы можете сделать это, например, в конструкторе:

    class A {
        constructor(){
           this.func = this.func.bind(this)
        }
    	func() {
    		console.log(this)
    	}
    }
    
    let a = new A();
    let b = a.func;
    b();
...