Если адрес массива был удалён, сохраняется ли он в памяти?
Извиняюсь, если ответ на этот вопрос уже был. Упрощённый пример:
var array1=[0,0]
var func=function(){
var array2=array1.slice()
//
array2[0]=1
array1=array2
}
func()
Насколько я знаю, локальные переменные, находящиеся внутри функции пропадают после выполнения функции, массивы array1 и array2 являются разными, однако array1=array2 заставляет ссылатся на массив, адрес в памяти(ссылка) которого пропадёт после выполнения функции. Вопросы:
- Останутся ли в памяти оба массива ?
- Если да, то можно ли как то очистить память массива, например array1=[];array1=array2
- И как можно посмотреть все массивы в памяти страницы ?
Ответы (1 шт):
Вы немного путаете очистку памяти от данных и от идентификаторов - это разные вещи
Когда вы пишите var array1 = [0, 0]
, то вы создаёте идентификатор, который ссылается на массив, который создался и лежит где-то там в памяти
Когда внутри функции вы создаёте массив, то он тоже попадет в память, которая от функции никак не зависит, просто внутри функции вы создаёте новый идентификатор array2
, который ссылается на новый массив. А вот уже новый идентификатор зависит от функции, в том плане что его его область видимости вся функция, потому пока "жива" функция "жив" и индентификатор
После того как вы пишите array1 = array2
, то вы по сути просите первый идентификатор ссылаться на новый массив и т.к. ни первый индентификатор ни новый массив никак с самой функцией не связаны, то и после окончания работы функции и индентификатор и новый массив будут "живы"
Второй идентификатор удалится по окончании работы функции, а вот первый массив очистится когда-то сборщиком мусора, потому что на него больше никто не ссылается (на самом деле сейчас используется другой алгоритм, который лучше очищает память, вместо проверки на наличие ссылок, очищаются все объекты, до которых нельзя достучаться подробнее тут)