**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 에 없다.