//1. 전역 Lexical 환경 생성
let age; //아직 할당이 안된 상태라 초기값은 undefined
age = 26; //age에 숫자 26이 할당
function addAge(num){
console.log(age + num) //27
//addAge 내부 Lexical 환경에서 age와 num의 값을 탐색
//num은 있지만 age가 없어 외부 환경 -> 전역 환경 순으로 넓히며 찾음
//전역 환경에서 age 값 발견
}
addAge(1)
//2. addAge의 내부 Lexical 환경 생성
- <전역 Lexical 환경>
- age : let으로 선언되어 초기화 X로 사용 불가
- addAge : function
- <addAge의 내부 Lexical 환경>
- num : 1
*코드에서 변수를 찾을때 내부에서 변수를 찾고 없으면 외부, 없으면 전역 Lexical 환경까지 범위를 넓혀서 찾음 (반대 방향으론 X 즉, 안에서 밖은 참조 가능, 밖에서 안은 불가)
//1. 전역 Lexical환경 생성
function makeAdder(x){
return fuction(y){ //상위 함수인 makeAdder의 x에 접근 가능
return x + y;
}
}
const add3 = makeAdder(3)
//2. makeAdder 내부 Lexical 환경 생성
console.log(add3(2)) //5
//3. 익명함수의 내부 Lexical 환경 생성(return 함수)
//익명함수 내부 Lexical 환경 -> makeAdder 내부 Lexical 환경 -> 전역 Lexical 환경 순으로 탐색
//익명함수 내부 Lexical 환경에서 y를 찾음 //2
//makeAdder 내부 Lexical 환경에서 x를 찾음 //3
//return x + y; 완성
const add10 = makeAdder(10)
//4. makeAdder 내부 Lexical 환경 생성
//makeAdder(10)이 호출되어도 add10과 add3은 서로 다른 환경을 가지고 있기 때문에 add3은 아무런 변화 없음
console.log(add10(5)) //15
//5. 익명함수의 내부 Lexical 환경 생성(return 함수)
//익명함수 내부 Lexical 환경에서 y를 찾음 //5
//makeAdder 내부 Lexical 환경에서 x를 찾음 //10
//return x + y; 완성
console.log(add3(1)) //4
//6. 익명함수의 내부 Lexical 환경 생성(return 함수)
//익명함수 내부 Lexical 환경에서 y를 찾음 //1
//makeAdder 내부 Lexical 환경에서 x를 찾음 //3
//return x + y; 완성
- <전역 Lexical 환경>
- makeAdder : fuction, 사용 가능
- add3 : 초기화 X, 사용 불가
- add10 : 초기화 X, 사용 불가
- <makeAdder 내부 Lexical 환경>
- x : 3
- <익명함수의 내부 Lexical 환경>
- y : 2
- <makeAdder 내부 Lexical 환경>
- x : 10
- <익명함수의 내부 Lexical 환경>
- y : 5
- <익명함수의 내부 Lexical 환경>
- y : 1
//1. 전역 Lexical 환경 생성
fuction makeCounter() {
let num = 0;
return function() {
return num++;
};
}
let counter = makeCounter()
//2. makeCounter 내부 Lexical 환경 생성
console.log(counter())
//3. 익명의 내부 Lexical 환경 생성
//외부함수의 변수 num에 접근
//num : 0
console.log(counter())
//++되어 1
console.log(counter())
//++되어 2
//생성된 익명의 내부환경을 기억하여 +1
//이 숫자들은 수정 불가, 오직 counter를 증가시키고 리턴함
//은닉화 성공
- <전역 Lexical 환경>
- fuction : makeCounter
- counter : 초기화 X, 사용 불가
- <makeCounter 내부 Lexical 환경>
- num : 0
const adder = function (x) {
return function (y) {
return x + y;
}
}
const adder = function (x) { //x : 외부함수의 변수
return function (y) { //y : 내부함수의 변수
return x + y;
}
}
//전역 Lexical 환경 생성
const adder = function (x) {
return function (y) {
return x + y;
}
}
const add5 = adder(5)
//adder 함수의 내부 Lexical 환경 생성
//함수 실행이 끝나도 5라는 값 사용 가능
add5(7)
//익명 함수의 내부 Lexical 환경 생성
//익명 함수의 내부 Lexical 환경에서 y를 찾음
//adder 함수의 내부 Lexical 환경을 참조하여 x를 찾음
//x : 5, y : 7이 되므로 결과는 12
- <전역 Lexical 환경>
- adder : function
- add5
- <adder 함수의 내부 Lexical 환경>
- x : 5
- <익명 함수의 내부 Lexical 환경>
- y : 7
const tagMaker = tag => content => `<${tag}>${content}</${tag}>`
const divMaker = tagMaker('div');
//tagMaker 함수의 내부 Lexical 환경 생성 (tag : 'div')
divMaker('hello')
//익명의 내부 Lexical 환경 생성 (content : 'hello')
//'<div>hello</div>'
const makeCounter = () => {
let value = 0;
return {
increase : () => {
value = value + 1;
},
decrease : () => {
value = value - 1;
},
getValue : () => value
},
}
const counter1 = makeCounter();
counter1 //{increase: f, decrease: f, getValue: f}