Проверяет понимание того, как замыкания захватывают примитивы и объекты, и почему изменения внешних значений видны внутри функции.
Замыкание — это функция, которая запоминает своё лексическое окружение и может обращаться к переменным из внешней функции даже после её завершения. Ключевой момент: замыкание захватывает не копию значения, а саму переменную (binding), то есть ссылку на ячейку в scope. Поэтому важно различать, что именно хранится в этой ячейке — примитив или ссылка на объект.
Примитивы (number, string, boolean, null, undefined, symbol, bigint) хранятся по значению. Но переменная, содержащая примитив, — это ячейка, значение которой можно перезаписать. Замыкание видит актуальное значение этой ячейки на момент вызова.
function makeCounter() {
let count = 0; // примитив в замыкании
return function () {
count += 1; // перезаписываем значение ячейки
return count;
};
}
const counter = makeCounter();
console.log(counter()); // 1
console.log(counter()); // 2
Здесь count — примитив, но замыкание изменяет его через переприсваивание, и это работает, потому что функция держит ссылку на переменную, а не на её снимок.
Объекты (включая массивы и функции) хранятся по ссылке. Переменная содержит адрес объекта в heap. Замыкание захватывает эту ссылку, поэтому мутация свойств объекта видна и снаружи, и внутри.
function makeUser() {
const user = { name: 'Ann' };
return {
rename(newName) { user.name = newName; }, // мутация объекта
getUser() { return user; }
};
}
const api = makeUser();
api.rename('Bob');
console.log(api.getUser().name); // Bob
Если же переприсвоить саму переменную user = {...}, замыкание увидит новый объект, потому что изменилась ячейка, а не объект.
Итог: замыкания всегда работают с переменными, а не со значениями. Примитивы ведут себя как изменяемые ячейки, объекты — как общие ссылки. Понимание этого различия помогает избегать багов с общим состоянием и правильно проектировать инкапсуляцию.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию