@vetsmen

Как тут работают замыкания?

Есть такой код:
let user = {
  firstName: "Вася",
  sayHi() {
    alert(`Привет, ${this.firstName}!`);
  }
};

setTimeout(user.sayHi, 1000); // Привет, undefined!

и такой:
let user = {
  firstName: "Вася",
  sayHi() {
    alert(`Привет, ${this.firstName}!`);
  }
};

setTimeout(function() {
  user.sayHi(); // Привет, Вася!
}, 1000);


В первом примере я понимаю, что мы передаем в функцию setTimeout только функцию user.sayHi. И во время выполнения setTimeout имеет ссылку на this отличную от ранее созданного объекта.
А почему это работает во втором случае? Ведь мы вызываем анонимную функцию, как она сохраняет ссылку на this объекта user? Почему в этом случае происходит не как в первом случае?
  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
@Azperin
Дилетант
В первом случае ты просто даешь ссылку на какую-то функцию, как на переменную, при такой передаче она обезличена и не имеет конктекста, тоесть это ровно тоже самое что и если записать так:
let user = {
  firstName: "Вася",
};

setTimeout(function sayHi() {
  alert(`Привет, ${this.firstName}!`);
}, 1000);


Во втором случае ты именно что ВЫЗЫВАЕШЬ функцию на объекте user, соответственно и this этого объекта в ней доступен
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы