외부함수에 접근할 수 있는 내부함수
정의: 함수와 함수가 선언된 어휘적(lexical) 환경의 조합, 이 환경은 클로저가 생성된 시점의 유효범위 내에 있는 모든 지역 변수로 구성된다.
조금 더 쉽게 말하자면, 함수 내에서 다른 함수(내부 함수)가 리턴이 되면, 이 함수를 클로져 함수라고 부르고, 외부 함수에 있는 변수에 접근 가능하다.
쉽게 말하자면 밖에서는 안이 보이지 않고 안에서는 밖을 볼 수 있다. ex)썬팅된 차량
클로저는 자바스크립트 고유의 개념이 아니라 함수를 일급 객체로 취급하는 함수형 프로그래밍 언어(Functional Programming language: 얼랭(Erlnag), 스칼라(Scala), 하스켈(Haskell), 리스프(Lisp)…)에서 사용되는 중요한 특성이다.
다음 예제 코드를 보자,
function init() {
var name = "Mozilla"; // name은 init에 의해 생성된 지역 변수이다.
function displayName() { // displayName() 은 내부 함수이며, 클로저다.
alert(name); // 부모 함수에서 선언된 변수를 사용한다.
}
displayName();
}
init();
init()
은 지역 변수 name
과 함수 displayName()
을 생성한다.
displayName()
은 init()
안에 정의된 내부 함수이며 init()
함수 본문에서만 사용할 수 있다.
여기서 주의할 점은 displayName()
내부엔 자신만의 지역 변수가 없다는 점이다. 그런데 함수 내부에서 외부 함수의 변수에 접근할 수 있기 때문에 displayName()
역시 부모 함수 init()
에서 선언된 변수 name
에 접근할 수 있다. 만약 displayName()
가 자신만의 name
변수를 가지고 있었다면, name
대신 this.name
을 사용했을 것이다.