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
MvcBox
@MvcBox
Software Developer [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, т. к. нету ссылки на другие переменные.
Ответ написан
Ваш ответ на вопрос

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

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