Closure

>> 예시 출력란



클로저 사이의 상호작용

하나 이상의 내부 함수가 있을 때, 클로저들의 수행 결과는 예측하기 쉽지 않다. 함수 하나는 변수를 1씩 증가시키고 다른 함수 하나는 변수를 2씩 증가시키는 두 개의 내부함수가 있다고 가정해 보자.

							function outerFn () {
								var outerVar = 0;
								function innerFn1 () {
									outerVar++;
									$.print('(1) outerVar = '+outerVar);
								}
								function innerFn2 () {
									outerVar +=2 ;
									$.print('(2) outerVar = '+outerVar);
								}

								return {'fn1':innerFn1, 'fn2':innerFn2};
							}

							var fnRef = outerFn();
							fnRef.fn1();
							fnRef.fn2();
							fnRef.fn1();
							var fnRef2 = outerFn();
							fnRef2.fn1();
							fnRef2.fn2();
							fnRef2.fn1();					
						

을 사용해 두 함수의 참조를 반환하고 있다(이것은 부모로부터 내부 함수가 탈출할 수 있는 또 다른 방식의 예를 보이고 있다). 두 함수는 반환된 참조들을 사용해 호출될 수 있다.

							(1) outerVar = 1
							(2) outerVar = 3
							(1) outerVar = 4
							(1) outerVar = 1
							(2) outerVar = 3
							(1) outerVar = 4						
						

두 개의 내부 함수는 같은 지역변수를 참조하며, 같은 변수범위를 공유한다. innerFn1() 함수가 outerVar 값을 하나 증가시키고 나면 innerFn2()이 호출될 때 증가된 outerVar의 값으로 시작하게 된다. 이후에 다시 한번 outerFn1() 함수를 호출하면 이전과 마찬가지로 독립된 변수범위를 가지는 클로더들의 인스턴스가 새롭게 생성되는 것을 볼 수 있다. 객체지향 프로그래밍에 친숙한 개발자라면 이 코드를 보면서 인스턴스 변수처럼 행동하는 자유변수와 인스턴스 메서드처럼 행동하는 클로저를 가진 객체가 새롭게 생성되는 것과 같은 개념이라고 이해할 수 있을 것이다. 객체지향의 내부 변수처럼 이 변수도 지정된 버무이 밖에서는 직접 접근할 수 없으므로 객체지향에서 이야기하는 정보 은폐기능을 가진다.