클로저란 함수와 함수가 선언된 어휘적 환경의 조합이다라고 정의가 되어있다.
이 말을 들으면 마음에 확 와닿지가 않는다. 예를 들어 설명을 해보겠다.
function PlayGame(what) {
let game = what;
return function Who(who){
return `${who} plays ${game}!`;
}
}
let LostArk = PlayGame('LostArk')
let LoL = PlayGame('League of Legend')
LostArk('John')
=>"John plays LostArk!"
LoL('Smith')
=>"Smith plays League of Legend!"
PlayGame이라는 함수를 변수에 할당을 하게 되면 game라는 변수와 내부함수 who가 존재하게 된다. 여기서 playGame() 실행이 끝나면 (Who 함수가 리턴이 되면) game 변수에 접근 할 수 없다고 생각이 되지만 자바스크립트는 함수를 리턴하고 리턴하는 함수가 클로저를 형성한다.
여기에서 아까의 정의가 사용되는데 클로저는 함수가 선언된 어휘적 환경의 조합이다. who함수가 선언 됬을때 game라는 변수는 마치 전역변수 처럼 사용이 되는 것이다.
그래서 이같은 경우 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성이 되는 것이다. LostArk 변수를 선언하고 할당 하는 과정에서 PlayGame 함수의 인스턴스에 대한 참조가 이루어지기 때문에 클로저가 생성이 되고 game이 있는 어휘적 환경에 대한 참조를 유지하는 것이다.