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

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

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

Это просто преднамеренное поведение JS по умолчанию. Если вы хотите сохранить контекст функции, для этой цели доступен метод bind. Например. let b = a.func.bind(a).

junvar 22.05.2019 16:22
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
1
1
22
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Просто это коротко, если вы вызываете функцию для объекта, 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();

Другие вопросы по теме