원시값, 객체, 함수 등은 만들고 사용할 때 꼭 메모리에 올라와야만 한다. 이는 계속 메모리에 남아있으면 그만큼 메모리를 낭비하게되므로 가비지 컬렉션을 통해서 사용하지 않는 메모리 공간을 반환한다.
자바스크립트는 도달 가능성(reachability) 을 평가하여 가비지컬렉션을 수행한다. ‘도달 가능한(reachable)’ 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미한다. 도달 가능한 값은 메모리에서 삭제되지 않는다.
이런 값은 루트(root) 라고 부른다.
전역 변수에 객체가 저장되어있다고 가정해 봅시다. 이 객체의 프로퍼티가 또 다른 객체를 참조하고 있다면, 프로퍼티가 참조하는 객체는 도달 가능한 값이 된다.
자바스크립트 엔진 내에선 가비지 컬렉터(garbage collector)가 끊임없이 동작하면서 도달할 수 없는 객체를 제거한다.
// user엔 객체 참조 값이 저장된다.
let user = {
name: "John"
};
// user의 값을 다른 값으로 덮어쓰면 참조가 사라진다.
// user가 가리키던 객체는 더이상 도달할 수 없어 제거된다.
user = null;
참조를 user에서 admin으로 복사했다고 가정해봅시다.
// user엔 객체 참조 값이 저장됩니다.
let user = {
name: "John"
};
let admin = user; // 객체를 두 변수가 가리킨다.
user = null; //하나의 변수의 레퍼런스를 변경해도 여전히 객체에는 접근 가능하므로 메모리에서 제거되지 않는다.