Closure
Closure means that an inner function always has access to the vars and parameters of its outer function, even after the outer function has returned.
프로그램이 실행되면 코드가 작성된 대로 값, 변수, 함수 등을 메모리에 할당하며 생명주기(life cycle)가 결정된다. 블록의 위치에 따라 전역변수와 지역변수가 생성된다. 전역변수는 블록 외부에 선언된 변수로 프로그램 전체에서 접근 가능하고 전역 스코프를 가진다. 지역변수는 블록 내부에 선언된 변수로 블록 내부에서만 접근 가능하고 지역 스코프를 가진다.
const foo = 'global variable';
console.log(foo);
function scopeTest() {
const bar = 'local variable';
return bar;
}
console.log(bar); // Error;
일반적으로 전역변수는 프로그램 실행 시점부터 종료될때까지 값을 유지하고 있고 지역변수는 함수에서 값을 사용할때 메모리에 할당되었다가 연산이 종료되면 메모리에서 해제된다.
보통 함수에서 반환할때 사용된 변수를 메모리에서 삭제되기때문에 외부에서 접근이 불가능하다. 하지만 JS는 특이하게도 함수에서 반환된 변수를 계속 참조하여 사용할 수 있다. 이러한 특성이 클로저다.
클로저로 은닉화 구현
prototype을 통해 객체를 다루는 방식으로 구현.
function Maker(name) {
this._name = name;
Maker.prototype.showName = function() {
console.log('this is ' + this._name);
}
};
const make1 = new Maker('일번');
make1.showName(); // this is 일번
nake1._name = "첫번째";
make1.showName(); // this is 첫번째
function Maker(name) {
this._name = name;
return function () {
consoel.log('this is '+ this._name);
}
};
const make1 = Maker('일번');
make();
이렇게 지역변수를 외부에서 접근 할 수있다. 콜백이 작동하는 이유도 클로저에 있다. 하지만 단점이 있는데 이렇게 만들어진 값들은 Garbage Collector가 수집하지 않는다. 이를 해제하기 위해서는 명시적으로 삭제시켜줘야 한다.
make1 = null 으로 처리를 해서 메모리에서 날려버리자.
블로그 글에서 내린 정의를 읽고 한번에 이해하기 너무 어렵다. 또한 간단하게 한 문단으로 정리된것도 찾기 어려웠다. 블로그를 개인적인 용도로 기록하고 사용한다면 상관없지만 너무 당연하게 포털 검색에 노출되어있다. 차라리 외국 사이트를 찾아서 이해하는것이 편했다. 정말 심하다고 느낀것은 정의를 재귀적으로 정의해놓은것이다.
"클로저는 독립적인 (자유) 변수를 가리키는 함수이다. 또는, 클로저 안에 정의된 함수는 만들어진 환경을 ‘기억한다’."
??.... 사실 아직도 이렇게 내려진 정의를 읽고 이해하기 어렵다.
'Javascript' 카테고리의 다른 글
String 값은 어디에 저장이 될까? (0) | 2022.12.01 |
---|---|
자바스크립트의 Array (0) | 2022.11.30 |
변수의 유효범위(Scope)와 클로저, 가비지 컬렉션 (1) | 2022.11.30 |
함수 정리 (0) | 2022.11.29 |
버블링과 캡처링 (0) | 2021.11.12 |
댓글