본문 바로가기
javascript

closure

by rami_ 2022. 2. 2.

Closure : 어떤 함수 A에서 선언한 변수 a를 참조하는 내부함수 B를 외부로 전달할 경우 A의 실행 컨텍스트가 종료된 이후에도 변수 a가 사라지지 않는 현상.

var outer = function () {
  var a = 1;
  var inner = function () {
    return ++a;
  };
  return inner;
}

var outer2 = outer();
console.log(outer2()); //2
console.log(outer2()); //3
(function () {
  var a = 0;
  var intervalId = null;
  var inner = function () {
    if (++a >= 10) {
      clearInterval(intervalId);
    }
    console.log(a); 
  };
intervalID = setInterval(inner, 1000);
})();

 

 

closure의 메모리관리 : 클로저는 어떤 필요에 의해 의도적으로 함수의 지역변수 메모리를 소모하도록 함으로써 발생함. 그 필요성이 사라진 시점에는 더는 메모리를 소모하지 않게 해주면 됨. 참조 카운트를 0으로 만들면 언젠가 GC(Garbage Collector)가 수거하게 됨. 이때 소모됐던 메모리가 회수됨. 식별자에 참조형이 아닌 기본형 데이터(보통 null이나 undefined)를 할당하면 됨.

var outer = function () {
  var a = 1;
  var inner = function () {
    return ++a;
  };
  return inner;
}

var outer2 = outer();
console.log(outer2()); //2
console.log(outer2()); //3
outer = null; //outer 식별자의 inner 함수 참조를 끊음.
(function () {
  var a = 0;
  var intervalId = null;
  var inner = function () {
    if (++a >= 10) {
      clearInterval(intervalId);
      inner = null; //inner식별자의 함수 참조를 끊음.
    }
    console.log(a);
  };
  intervalID = setInterval(inner, 1000);
})();

 

'javascript' 카테고리의 다른 글

this  (0) 2022.02.16
prototype/__proto__  (0) 2022.02.05
Execute context  (0) 2022.02.02
callback  (0) 2022.02.01
While  (0) 2022.01.25