@vetsnakara

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

Не пойму, почему все-таки выводится user, ведь после setTimeout я удаляю ссылку на объект. Разве в замыкании делается копия объекта?

let user = {
  firstName: "Vasya"
};

function sayHi() {
   console.log(this.firstName);
};


// создает замыкание
function bind(context) {
  return function () {
    console.log(context);
  };
}

// bind выполнится после (*)
setTimeout(bind(user), 1000);

// удаляем ссылку на объект
user = null; // (*)
  • Вопрос задан
  • 82 просмотра
Решения вопроса 2
@ned4ded
Верстка, Фронтенд
Добрый день.

Вы удаляете ссылку на объект в переменной user, но не сам объект и не саму абстрактную ссылку (их может быть много). В js нельзя удалить объект, его удалением занимается garbage collector, вы можете удалить все ссылки и тогда объект будет удален из памяти.

При передачи объекта в замыкание, там сохраняется ссылка на него, а не на переменную user.

Собственно, даже чуть более простой код будет работать точно так же:
let object = { test: 'hey' }

let another = object

object = null

console.log(another)
// { test: 'hey' }
Ответ написан
@Omiant
В setTimeout вы передаете сам объект (ну точнее ссылку на объект), а когда вы дальше пишите user = null, то вы по сути просто присваиваете этой переменной другое значение, а не удаляете ссылку на тот объект. Надеюсь объяснил достаточно доступно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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