@mi1ord

Чему равен контекст в setTimeout?

Добрый день.

Не могу разобраться в контексте.
function Foo () {
  this.log = function () {
    console.log(this)  // Foo {log: f} (тут все ясно)
    setTimeout(() => console.log(this), 500)
  }
}

Внутри метода log, вызывается функция setTimeout, которая "передает" контекст стрелочной функции, и та прекрасно отрабатывает.
const f = new Foo()
f.log()  // Foo {log: f}

Исходя из определений, при вызове функции (даже внутри метода объекта) ее this равен глобальному объекту, в данном случае window.
Собственно, главный вопрос: почему setTimeout может передать контекст(в стрелочную функцию), который равен экземпляру, созданному при момощи конструтора Foo? Ведь setTimeout вызывается как функция.
У меня есть предположение, что тут присутствуют какие-то исключения, ну, или я что-то пропускаю.
  • Вопрос задан
  • 188 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Стрелочные функции не создают собственный контекст this, а используют this окружающего контекста, того места где они определены. В вашем случае это контекст вызова log. setTimeout просто вызывает колбек по истечению таймера, по аналогии с вызовом f.apply(null [, args]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Исходя из определений, при вызове функции (даже внутри метода объекта) ее this равен глобальному объекту, в данном случае window.

Исключением является как раз стрелочная функция, которая захватывает контекст не в момент вызова, а в момент объявления.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Digital Sharks Казань
от 60 000 до 65 000 руб.
CS Money Санкт-Петербург
от 120 000 до 150 000 руб.
Ingram Micro Cloud Москва
от 170 000 руб.