closure를 이해하기 위해선 javaScript가 어떻게 변수의 유효범위를 지정하는지(Lexical scoping) 이해해야함
lexical : 어휘적 범위 지정(lexical scoping) 과정에서 변수가 어디에서 사용 가능한지 알기 위해,
그 변수가 소스코드 내 어디에서 선언되었는지 고려한다는 것을 의미
자바스크립트는 함수를 리턴하고, 리턴하는 함수가 closure 형성
클로저는 함수와 함수가 선언된 어휘적 환경의 조합
이 환경은 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성
Example
function makeAdder(x) {
var y = 1;
return function(z) {
y = 100;
return x + y + z;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
//클로저에 x와 y의 환경이 저장됨
console.log(add5(2)); // 107 (x:5 + y:100 + z:2)
console.log(add10(2)); // 112 (x:10 + y:100 + z:2)
//함수 실행 시 클로저에 저장된 x, y값에 접근하여 값을 계산
Description
makeAdder(x)
: 단일 인자 x를 받아서 새 함수 반환
-> 반환되는 함수는 단일 인자 z 를 받아서 x와 y와 z의 합 반환
->add5, add 10
두 개의 새로운 함수 만들기 위해 makeAdder 사용add5
add10
: 두 개 모두 closure
서로 다른 맥락적 환경을 저장, 같은 함수 본문 정의 공유
(참고 문서 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures)
javaScript 함수 안에서, 당연하게 변수 선언하고 사용하는데 의문을 갖고 더 알아봤다.
lexical...
private method도 다룰 예정
.