JS는 메모리 관리를 하고있다.
우리가 만드는 모든 것들은 메모리를 차지한다. 이렇게 쌓이면 메모리를 많이 차지할텐데 쓸모없는 것들은 어떻게 처리할까?
JS는 도달 가능성이라는 개념을 사용해 관리를 수행한다.
어떻게든 접근하거나 사용할 수 있는 값을 의미한다.
도달 가능한 값은 메모리에서 삭제되지 않는다.
mark-and-sweep 이라고 불리는 가비지 컬렉션 알고리즘을 알아보자
가비지 컬렉터는 루트 정보를 기억하고 기억한다(mark)
루트가 참조하고 있는 모든 객체를 방문하고 기억한다.
mark된 모든 객체에 방문하고, 그 객체들이 참조하는 객체도 기억한다.
루트에서 도달 가능한 모든 객체를 방문한다.
mark되지 않은 모든 객체를 메모리에서 삭제한다.
세대별 수집 : 객체를 새로운 객체와 오래된 객체로 나눈다. 객체 상당수는 생성 후에 쓸모가 없어지는데, 이러한 객체를 새로운 객체로 구분한다. 일정시간 이상 살아남은 객체는 오래된 객체로 분류한다.
점진적 수집 : 모든 객체를 한번에 방문하고 기억하는데는 오래 걸리기 때문에 여러 부분으로 나누어 별도로 수행한다.
유휴시간 수집 : 실행에 영향을 주지 않기 위해 CPU가 유휴상태일때만 실행한다.
객체의 프로퍼티에 함수를 할당해 객체가 행동할 수 있게 한다.
메서드는 객체에 저장된 정보에 접근할 수 있어야 한다.
메서드 내부에서 객체에 접근하는 법은 ?
this는 메서드를 호출할 때 사용되는 객체를 나타낸다.
할당할때 user.name 으로 안하고 this.name 을 사용하는 이유가 무엇이죠?
외부 변수를 사용해 객체를 참조하면,let user = { name: "John", age: 30,
sayHi() {
alert( user.name );
}
};
```js
let admin = user;
user = null;
admin.sayHi(); // Error: Cannot read property 'name' of null
sayHi의 name은 user의 name을 참조하는데 현재 그 값이 없기 때문에 에러가 나게 된다.
this 는 나중에 한번더 공부를 하는걸로 하겠다.