메모리 누수는 프로그램에서 할당된 메모리를 해제하지 못한 경우를 말함
이로 인해, 성능이 떨어지고 간혹 프로그램 자체가 중단되기도 한다
자바스크립트에서 GC(Garbage Colleltor)가 메모리를 올바른 방식으로 해제하지 않은 경우 발생한다
javascript GC가 사용하는 알고리즘은 mark-and-sweep 이다
javascript memory life cycle
1. 할당
2. 사용
3. 해제 -> GC 부분이 알아서 처리해 준다.
let elements = {
button: document.getElementById('button'),
image: document.getElementById('image'),
text: document.getElementById('text')
};
function removeButton() { // The button is a direct child of body.
document.body.removeChild(elements.button);
console.log(elements.button);
// 여기서 elements 에서 여전히 button 참조를 가지고 있습니다.
// 이 경우 button element는 여전히 메모리에 상주하게 되며 GC에 의해 수집될 수 없습니다.
}
// 다른 예시
let one = document.getElementById('one');
let two = document.getElementById('two');
one.addEventListener('click', function() {
two.remove();
console.log(two); // 삭제 이후에도 html 을 출력할 것이다.
});
function foo(arg) {
bar = "안녕 나는 바야?";
// or
this.tt = 'TT'; // 여기서 this 는 window 객체를 가리킨다.
}
var a = 'apple';
b = 'oranage'; // var 키워드가 없으면 암묵적으로 전역변수
console.log(window.a, window.b);
// 안좋은 예시
let test = {name : 'zzz'};
function print(targetValue) {
console.log(targetValue.name);
}
print(test);
// 개선된 예시
let test = {name : 'zzz'};
function print(targetValue) {
console.log(targetValue);
}
print(test.name);
// 클로저 예제
function outer() {
var outerValue = 100;
function inner() {
// 내부함수에서 외부함수 변수에 접근이 가능하다.
// 내부 -> 외부로 검색하며(스코프 체이닝), 검색이 되면 해당 스코프에서 검색을 멈춘다.
// 외부에서 내부는 검색 불가
console.log(outerValue);
}
return inner; // 내부함수를 반환
}
var c = outer();
c();
console.dir(c);