theWaR_13
@theWaR_13

Как работет context в Javascript?

Привет всем. Думал что понимаю, как работает контекст, оказалось, что нет. Я накидал простой пример: https://codesandbox.io/s/ppk1v97yrj

Есть функция logThis, которая выводит в консоль текущий this. Очевидно, что если просто ее вызвать, this указывает на Window/undefined (в strict mode).
Второй тест - создание объекта, с методом, который вызывает logThis. Тоже очевидно, что this будет указывать на этот объект.
Третий тест - создание объекта через new с использованием функции, объект использует logThis через прототип. Тут this указывает на TestOne и это тоже понятно.
Четвертый тест - создание объекта через new с использованием class. Я не смотрел, как под капотом ES6 работает с классами, но есть подозрения, что должно получиться что-то вроде этого. Но видимо не совсем так, потому что this уже указывает на Window/undefined.

Соответственно есть вопрос, почему в 4 случае он указывает на window? Ведь this высчитывается динамически в зависимости от того, на каком объекте он вызыван, а в данном случае он вызван на объекте testObjTwo. Если у кого-то есть статья, где в деталях рассказывается про context, было бы замечательно.
  • Вопрос задан
  • 102 просмотра
Решения вопроса 2
rockon404
@rockon404
Frontend Developer
Так будет показывать экземпляр класса:
class TestTwo {
  constructor() {
    this.logThis = logThis;
  }
}


Почитать.
Ответ написан
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
Соответственно есть вопрос, почему в 4 случае он указывает на window?

Потому что у вас logThis вызывается в глобальном контексте. this устанавливается при каждом вызове каждой функции. Т.е., это переменная, которая внутри каждой функции своя, как локальная.
function logThis() {
  console.log('logThis', this);
}
class TestTwo {
  constructor() {}
  log() {
    logThis();
    console.log('TestTwo.log', this);
  }
}


https://codesandbox.io/s/n4x93k3ppl

UPD: Тут как раз подоспела свежая статья на хабре: https://habr.com/company/ruvds/blog/422089/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы