[JavaScript] 클로저(Closure)
글 작성자: 택시 운전사
반응형
정의
함수와 그 함수가 정의된 렉시컬 환경의 조합이다.
렉시컬 환경?
렉시컬 환경의 의미는 어휘적 범위를 정해주는 렉시컬 스코프를 통해 지정된 사용 가능한 변수들을 포함한 환경을 의미한다. 즉 렉시컬 스코프 안에 있는 변수들을 접근할 수 있는 환경이다.
사용 예시
예시 1
일반적으로 클로져는 함수안의 함수 형태로 정의된다.
let obj = function(){
let i = 0;
return {
setI(k){
i = k;
},
getI(){
return i;
}
} // 호출시 얻는 함수들이 외부 함수의 변수인 i에 대한 메모리를 가지고 있는다.
}
let x = obj();
x.setI(2);
console.log(x.getI()); // 2
x.setI(4);
console.log(x.getI()); // 4
console.log(x.getI) // 해당 method는 스코프에 클로져를 가지고 있다.
예시 2
전역 변수에 접근하는 함수도 클로저의 범위안에 들어갈 수 있다.
var passed = 3; // 함수 안에서 접근 가능 by lexical scoping
var addTo = function(){
var inner = 2; // 밖에서 접근 불가
return passed + inner;
};
console.log(addTo()); // 5
var passed = 4;
console.dir(addTo);
console.log(addTo()); // 6
// 이것도 클로져다!!! 가장 간단한 클로저 구현체
// addTo를 실행하기 위해서 내부의 변수로는 결과를 얻을 수 없다.
// 따라서, 해당 변수를 찾을 때까지 더 바깥쪽 scope를 확인한다.
// 위에서 addTo의 클로져에서 passed의 값은 4이다.
예시 3
가장 일반적으로 클로져에 대한 설명을 할 때 사용하는 예시이다.
var addTo = function(passed){
var add = function(inner){
return passed + inner;
};
return add;
};
console.dir(addTo(3));
// 일반적인 형태의 클로져
// 0: Closure (addTo)
// passed: 3
var addThree = new addTo(3);
var addFour = new addTo(4);
console.dir(addThree);
// 0: Closure (addTo)
// passed: 3
console.dir(addFour);
// 0: Closure (addTo)
// passed: 4
console.log(addThree(1)); // 4
console.log(addFour(1)); // 5
결론
- 바깥에서 선언된 변수를 사용하는 모든 함수는 클로저다.
- 클로져는 단지 데이터를 보관하고 있는 함수에 불과하다.
- 설명을 하면서 예시를 들어야할 때, 굳이 어렵게 생각하지 말고 가장 간단한 형태와 간단한 정의를 생각하자.
참고
반응형
'Web > JavaScript' 카테고리의 다른 글
[JavaScript] {} + {}의 결과는 뭘까? (0) | 2019.12.14 |
---|---|
[JavaScript] Ajax (0) | 2019.12.11 |
🕵️♂️ 자동완성 모듈의 법칙 (0) | 2019.08.22 |
[JavaScript] JavaScript와 Functional Programming 그리고 Closure (0) | 2019.08.10 |
[JavaScript] JavaScript의 기본 원리 (0) | 2019.08.01 |
댓글
이 글 공유하기
다른 글
-
[JavaScript] {} + {}의 결과는 뭘까?
[JavaScript] {} + {}의 결과는 뭘까?
2019.12.14 -
[JavaScript] Ajax
[JavaScript] Ajax
2019.12.11 -
🕵️♂️ 자동완성 모듈의 법칙
🕵️♂️ 자동완성 모듈의 법칙
2019.08.22 -
[JavaScript] JavaScript와 Functional Programming 그리고 Closure
[JavaScript] JavaScript와 Functional Programming 그리고 Closure
2019.08.10