Почему не создаётся замыкание?

Почему в этом коде замыкание создаётся:

let user = {
        firstName: "Вася",
        sayHi: function() {
            console.log( user.firstName );
        }
    };

    user.sayHi();


А в этом нет:

let user = {
        firstName: "Вася",
        sayHi: function() {
            console.log( this.firstName );
        }
    };

    user.sayHi();


В отладчике, в примере с user. firstName в Scopes, есть свойство Closure, в другом примере этого свойства нет.

5b99960599d10565868316.jpeg5b99961526e57082889453.jpeg
  • Вопрос задан
  • 420 просмотров
Пригласить эксперта
Ответы на вопрос 3
profesor08
@profesor08 Куратор тега JavaScript
Функция, которую объявляешь в объекте, не будет иметь контекст этого объекта. В твоем случае он у не свой. Если использовать стрелочную функцию () => {}, то ее контекстом будет тот, в котором объявлен сам объект в котором объявлена функция. Коротко говоря, ты не можешь обратиться через this к объекту в котором объявлена функция. Чтоб это произошло надо либо делать как-то иначе, либо задать ей нужный контекст.

function User() {
  this.firstName = "Вася";

  this.sayHi = () => {
    return this.firstName;
  }
}

let user = new User()

console.log(user.sayHi());
Ответ написан
@Limo
Веб разработчик
Вопрос странный, смею предположить, что вы хотели узнать почему this.firstName ничего вам не возвращает.
Если так то дело в области видимости функций.
Юзайте стрелочные функции и будет вам счастье. Ну и почитайте про функции конечно же.
let user = {
        firstName: "Вася",
        sayHi: () => {
            console.log( this.firstName );
        }
    };
    user.sayHi();
Ответ написан
Xuxicheta
@Xuxicheta
инженер
Потому что контекст это не замыкание. Разумеется this нет в closure.
Замыкание это ссылки на переменные из внешнего лексического окружения, которые использует ваша функция. А this это ссылка на текущий конекст, он может меняться.

Вот, должно все прояснить jsfiddle.net/xuxicheta/u7jzfgm2/6
Ответ написан
Ваш ответ на вопрос

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

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