@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 вызывается как функция.
У меня есть предположение, что тут присутствуют какие-то исключения, ну, или я что-то пропускаю.
  • Вопрос задан
  • 593 просмотра
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Стрелочные функции не создают собственный контекст this, а используют this окружающего контекста, того места где они определены. В вашем случае это контекст вызова log. setTimeout просто вызывает колбек по истечению таймера, по аналогии с вызовом f.apply(null [, args]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Исходя из определений, при вызове функции (даже внутри метода объекта) ее this равен глобальному объекту, в данном случае window.

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

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 23:00
5000 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект