**lexical**
함수와 변수의 Scope 를 **선언된 위치를 기준**으로 정한다.
var x = 10;
func() {
var x = 10;
func2() {
log(x)
}
}
func2 는 func 의 lexical scope에 대한 참조를 가진다. func2는 x 변수를 자신의 scope 에서
찾지 못하면 외부, Scope chain 으로 연결된 func 에서 찾게 된다. 여기서도 없으면 전역변수 x 를
찾게 되는 것이다.
**closure**
자신이 생성된 시점의 환경을 기억하고 있다. JS 의 문맥의 흐름에 의거해 탄생했다.
let x = 10;
function outer(num) {
let y = 20;
return (function () {
console.log(x + y + num);
})();
}
const result = outer(1000); // 1030 이 출력된다.
참 신기하다. outer 안의 즉시실행 함수는 본인의 환경을 기억함으로써, y, num 을 모두
사용 가능 하다는 것이다. 메모리에 잡혀있다는 뜻이 되겠다.
또한 scope chain 은 내부 함수가 사용하는 정보들에 대해서만 유지 해 준다.
개발자 모드에서 확인 해 보면 이를 알 수 있다.
let x = 10;
function outer(num) {
let y = 20;
return function middle(middleNum) {
let m = 30;
return function inner() {
console.log(x + y + num);
};
};
}
var middle = outer(100);
var inner = middle(100);
console.dir(inner);
middle 은 scopes 에 없다.