Как работает контекст вызова функций? И почему так?

Искренне не понимаю (пока), почему функции в одном случае вызываются в глобальном контексте, в другом в локальном. Я где-то пропустила важный факт? Читала про лексическое окружение, ок, читала про Scope, ок. Но как всё под капотом в разных условиях работает, не могу уложить в голове.

class Foo{
  constructor(){
    this.bar()
  }
  
  bar(){
  console.log(this);
  }
  
}

let foo = new Foo();// class

/*******************************************/
foo.bar(); // class

/*******************************************/
let btn = document.querySelector('button');
btn.addEventListener('click', foo.bar); // html-элемент

/*******************************************/
function glob(){
  function inFoo(){
    console.log(this);
  }
  
  inFoo();
}

glob(); // window
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
KrisIris
@KrisIris Автор вопроса
Вот нашла хороший, на мой взгляд, ответ. Как раз для таких вопросов!))))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Функции вызываются в том контексте, в котором вызываются (это важная тавтология), а не объявляются.

Вызываете bar в конструкторе? Там this равен тому объекту, который создаётся.
В том месте, где вызывается glob() действует глобальный контекст.
Обработчик события вызывается js-движком, который работает, разумеется, в глобальном контексте, поэтому и для обработчика действует глобальный контекст, но движок автоматически для удобства разработчиков привязывает контекст элемента, на котором произошло событие.

Рекомендую ознакомиться: Привязка контекста и карринг: "bind"
Ответ написан
Ваш ответ на вопрос

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

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