외부함수( 포함하고 있는 )의 변수에 접근할 수 있는 내부 함수를 일컫는다.
스코프 체인으로 표현되기도 하며, 클로저는 세가지 스코프 체인을 가진다.
자신에 대한 접근( 자신의 블럭내에 정의 된 변수 )
외부 함수의 변수에 대한 접근
전역 변수에 대한 접근
내부함수는 외부함수의 변수 뿐만 아니라 파라미터에도 접근할 수 있다. 단 내부함수는 외부함수의 arguments 객체를 호출할 수는 없다. 하지만 외부 함수의 파라미터는 직접 호출할 수 있다.
클로저는 Node.js 의 비동기, 논-블록킹 아키텍쳐의 핵심기능으로 활용되고 있다. jQuery에서도 빈번히 사용되며 거의 모든 자바스크립트 코드에서 볼 수 있다.
클로저 규칙과 부수 효과
클로저는 외부함수가 리턴된 이후에도 외부함수의 변수에 접근할수 있다.
클로저를 사용하면서 가장 헷갈리는것 중의 하나는 외부함수가 리턴된 이후에도 여전히 내부함수가 외부함수의 변수에 접근하고 있다는 것이다. 자바스크립트의 함수가 실행되었을때, 함수는 자신이 생성되었을때와 동일한 스코프 체인을 사용한다. 그러므로 내부 함수를 나중에 호출할 수 있다.
클로저는 외부 함수의 변수에 대한 참조를 저장한다.
클로저는 실제 값을 저장하지 않는다. 아래의 내부(private) 변수예제는 더글라스 크락포드(Douglas Crockford)에 의해 처음 시연되었다.
클로저 비꼬기
클로저가 갱신된 외부함수의 변수에 접근함으로써, 외부 함수의 변수가 for문에 의해 변경될 경우 의도치 않은 버그가 발생할 수 있다.
위의 예제에서, 익명의 내부함수가 실행될 시점에 i의 값은 3이다(배열의 크기만큼 증가한 값). 숫자 3은 uniqueID에 더해져 모든 celebritiesID에 103을 할당한다. 그래서 기대(100,101,102)와 달리 모든 리턴된 배열의 id=103이 된다.
이런 결과가 나타난 이유는, 앞서 언급했듯이 클로저는(이 예제에서 내부의 익명함수) 외부 변수에 대해 값이 아닌 참조로 접근하기 때문이다. 즉, 클로저는 최종 갱신된 변수(i)에 대해서만 접근할 수 있으므로, 외부 함수가 전체 for문을 실행하고 리턴한 최종 i의 값을 리턴하게 된다. 100+3=103.
이런 부작용을 고치기 위해서 “즉시 호출된 함수 표현식(Immediately Invoked Function Expression. IIFE)”를 사용할 수 있다.
Comments