// 1. 처음 Lexical 환경 (전역 Lexical 환경)
// one은 Lexical 환경에는 올라가나 초기화가 되어있지 않아 사용 불가
// addOne 함수는 사용가능
// 2. let one; 코드를 만났을 때
// one은 호이스팅되어 사용은 가능하나 undefined
let one;
// 3. one = 1; 코드를 만났을 때
one에 숫자 1이 할당된다.
one = 1;
function addOne(num) {
console.log(one + num);
}
// 4. addOne(5)를 만났을 때
새로운 Lexical환경이 만들어진다. (내부 Lexical 환경)
이 때 함수가 넘겨받은 매개변수와 지역변수가 할당되어, num에 숫자 5가 할당된다.
addOne(5);
function makeAdder(x) {
return function(y) {
return x+y;
}
}
const add3 = make Adder(3);
console.log(add3(2)); // add3함수가 생성된 이후에도 상위함수인
// makeAdder의 x에 접근이 가능하다. ->Closure
const add10 = make Adder(19);
console.log(add10(5));
console.log(add3(1));
함수와 렉시컬 환경의 조합이다. 함수가 생성될 당시의 외부 변수를 기억한다. 생성 이후에도 계속해서 접근이 가능하다.
function makeCounter() {
let num = 0;
return function() {
return num++;
}
}
let counter = makeCounter();
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
counter() 결과값은 수정이 불가능하다. 은닉화에 성공한 것이다.