종료된 외부함수임에도 외부함수로 인해서 파생된 이미 사라진 외부함수에 접근하여 값을 갖고 올 수 있다.
함수가 선언 됬을 때의 렉시컬환경을 기억한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
functionoutter() { var title = "외부함수 지역변수";
returnfunction() { alert(title); }; }
var inner = outter(); // 변수 inner에 의해서 outter 함수는 호출 되고 실행되어져서 자신의 역할을 끝냈다. 그리고 그 안의 지역변수 title은 소멸됬다. // 이 부분에서의 outter를 설명하는 것 // 새로 outter() 하면, 다시 호출 /실행 / 지역변수 발생 / 소멸이 된다.
inner(); // inner안의 함수 호출, return값 호출 // title의 값은 outter안의 지역변수이다. // <클로져> 외부함수 outter에 접근하여 title값을 가져온다.
내부함수가 외부함수의 지역변수에 접근 할 수 있다. **외부함수**는 외부함수의 지역변수를 사용하는 내부함수가 소멸 될 때까지 소멸되지 않는다!
렉시컬 스코핑(Lexical scoping) 스코프가 결정되는 범위를 말하며, 함수, 변수를 호출할 때가 아니라 함수, 변수를 어디에 선언하였는지에 따라 결정되는 것
렉시컬 환경(Lexical environment) 함수가 선언됬을 때의 스코프
2. 스코프체인과 렉시컬 스코프의 관계
innerFunc가 상위 스코프에 접근할 수 있는 것은 렉시컬스코프의 레퍼런스를 차례대로 저장하고 있기 때문이다. 렉시컬의 저장 값 덕분에 함수 안의 함수, 그 함수 안의 함수 등이 되어도 꼬이지 않고 잘 실행되는 것 !!!
1 2 3 4 5 6 7 8 9 10 11 12 13
functionouterFunc() { var inner = "local";
functioninnerFunc() { console.log(inner); // 변수 inner는 값이 없기 때문에 그 위에 함수에서 지역변수 inner값을 찾게 된다. }
innerFunc(); }
outerFunc(); // local
3. 클로저를 사용하는 이유
비밀변수 (Private variable)
Javascript는 비밀 변수가 없다 -> function scope를 이용해서 비밀 변수를 만들어 줄 수 있다.