Безопасно ли создавать и возвращать объект, созданный в функции? - PullRequest
1 голос
/ 23 января 2020

У меня есть следующий код:

function createPersone(gender){
 let localPerson = new Object();
 localPerson.gender = gender;
 return localPerson;
}

let globalPerson = createPerson("female");

В функции создается ссылка на объект, localPerson содержит адрес, где созданный объект находится в памяти. Когда возвращается localPerson, этот адрес копируется в globalPerson. Однако localPerson имеет функцию видимости, поэтому он должен быть уничтожен, но его содержимое является адресом. Тот, кому адресные точки (а именно объект) также был удален? Удаление объекта должно быть убрано из сборки мусора. В этом случае я могу считать безопасной инструкцию let globalPerson = createPerson("female"); и почему? Что происходит за капотом?

1 Ответ

3 голосов
/ 23 января 2020

Пока у вас есть способ получить доступ к некоторому значению, это значение не будет собираться мусором. То есть для любого правильно реализованного сборщика мусора для JavaScript вы никогда не найдете значение, уничтоженное сборщиком мусора, если вы можете получить к нему доступ.

Поскольку функции не создаются и не возвращаются из createPerson это правда, что замыкание, созданное с помощью вызова createPerson, будет собирать мусор, поэтому локальная переменная замыкания localPerson будет уничтожена. Однако значение, на которое ссылается эта переменная, не будет уничтожено, поскольку оно все еще доступно через переменную globalPerson.

...