스코프
: 변수가 어디 범위까지 참조되는 지를 뜻함(= 유효 범위)
- 전역 scope, 지역 scope
- var는 함수 수준의 scope, const와 let은 블록 수준의 scope이다.
클로저
내부함수가 외부함수의 맥락(ex. 지역변수)에 접근할 수 있고, 외부함수 종료 후에도 여전히 접근할 수 있는 특성을 가진 외부함수의 독립된 복사본
: 함수가 선언된 환경의 스코프를 기억하여 함수가 스코프 밖에서 실행될 때에도 기억한 스코프에 접근할 수 있게 함
- ex. 함수 내에 있는 지역 scope의 변수는 실행시점, 즉 함수 밖에서도 클로저를 통해 접근할 수 있다
- 클로저를 이용하여 내부 변수화 함수를 숨길 수 있다. (ex. 함수안의 변수를 밖에서 바로 사용하지 않고, 함수의 return문의 멤버의 값으로 할당한 뒤 밖에서 사용하는 방식)
⇒ 외부 함수의 지역변수는 따로 리턴하지 않는 이상 전역에서 접근할 수 없어서, 접근할 수 있는 내부함수를 만들고 이를 리턴하여 전역에서 외부함수의 지역변수를 조작한다.
for(var i = 0; i < 5; i++){ arr[i] = function(){ return i; } } // 5 5 5 5 5 가 리턴됨, // why? function이 중첩 함수가 아니기 때문에 i는 지역이 아닌 전역변수를 참조하여 클로저 해당 x // 클로저를 사용하게 수정하면, 0 1 2 3 4가 나옴 for(var i = 0; i < 5; i++){ arr[i] = function (id) { function(){ return id; } }(i); }