클로저의 특징
1. 상태 유지
-현재 상태를 기억하고 변경된 최신 상태를 유지한다.
2.전역 변수의 사용 억제
-만약 자바스크립트에 클로저라는 기능이 없다면 상태를 유지하기 위해 전역 변수를 사용할 수 밖에 없다. 전역 변수는 언제든지 누구나 접근할 수 있고 변경할 수 있기 때문에 많은 부작용을 유발해 오류의 원인이 되므로 사용을 억제해야 한다.
const hello = function() {
console.log("Hello World");
return function() {
console.log("Hello World 22");
}
}
const hello2 = hello();
hello2();
const globalVar = '전역 변수';
function outerFn() {
const outerFnVar = 'outer 함수 내의 변수';
const innerFn = function() {
return 'innerFn은 ' + outerFnVar + '와 ' + globalVar + '에 접근할 수 있습니다.';
}
return innerFn;
}
const innerFnOnGlobal = outerFn();
const message = innerFnOnGlobal();
console.log(message);
//innerFn은 outer 함수 내의 변수와 전역 변수에 접근할 수 있습니다.
-??innerFnOnGlobal은 outerFnVar에 접근 못하지 않나??
내부 스코프레 접근할 수 없으니까!!
왜 접근할 수 있을까?? innerFn 함수가 최초 선언되었던 환경에서는 outerFnVar에 접근할 수 있기 때문이다. innerFnGlobal은 innerFn의 주소값을 가지고 있고, innerFn은 클로저로서 outerFnVar에 접근할 수 있다. 이 환경을 렉시컬 환경이라고 한다.