Задать вопрос
BruTO8000
@BruTO8000
Пытаюсь научиться разработке

Замыкание запоминает все или то, что нужно?

Условно у нас есть функция которая имеет локальные переменные и возврощает объект, который имеет методы для работы с локальными переменными, которые в свою очередь замыкаются.
function a(){
    let name = 'Ivan';
    let surname = "Ivanov";
    let arr = [1,2,3,4,5];
    return {
        getName : () =>{ return name}
    }
}
obj = a();
console.log (obj.getName()) // IVAN

Все замкнутые переменные хранятся в оперативной памяти.
В объекте "obj" замыкаается только name (так как оно используется)? Или все остальное так-же?
  • Вопрос задан
  • 95 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
MvcBox
@MvcBox
Software Engineer [C/C++/JS(for Node.js)/etc]
В объекте "obj" замыкаается только name (так как оно используется)? Или все остальное так-же?

Вы немного не так понимаете как это работает.
Замыкание идет на LexicalEnvironment родительской функции (в котором уже и содержатся локальные переменные), а не на конкретную переменную.
Родительский LexicalEnvironment не будет удален до тех пор, пока на него есть ссылки.

Можете проверить это следующим кодом:
test.js
'use strict';

function factory() {
    const var1 = 111;
    const var2 = 222;
    const var3 = 333;

    return {
        test: function (code) {
            eval(code);
        }
    };
}

const obj = factory();

setTimeout(function () {
    obj.test('console.log(var1);');
}, 5000);

setInterval(function () {
    global.gc();
});


node --expose-gc test.js
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Seasle
@Seasle Куратор тега JavaScript
Нет, все остальное съедает GC, т. к. нету ссылки на другие переменные.
Ответ написан
Ваш ответ на вопрос

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

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