Lexical Environment
Lexical Environment: 실행중인 함수나 스크립트 전체, 혹은 코드블럭은 본인만의 Lexical Environment가 있다.
환경레코드, 외부 렉시컬 환경으로 구성.
환경레코드
지역변수를 객체로 저장.
function, this경우 매개변수 포함.
function add(a, b) {
let number = 1
return a + b + number
}
add()
// 환경레코드 => { number: 1, a: undefined, b: undefined }
외부 렉시컬
현재 렉시컬 환경보다 상위의 렉시컬 환경.
Script는 최상위 렉시컬 환경. Script 내부에서 호출된 함수나 코드블럭은 외부 렉시컳 환경으로 Scirpt 렉시컬 환경 참조.
렉시컬 환경이 생성될 때 Environment라는 숨겨진 Property 생성. Property에는 외부 렉시컬 환경이 기억.
지역 내에서 참조할 값이 없는 경우 상위로 계속해서 chaining 발생.
따라서 모든 함수는 Closure와 동일.
함수 실행 시 렉시컬 환경 구성
function add() {
let addedNumber = 1
return function() {
return addedNumber++
}
}
// 변수에 하나의 함수를 저장 시 하나의 렉시컬 환경이 생성.
let addFunc = add()
// 따라서 addedNumber가 참조되고 증가된 값이 반영됨.
console.log(addFunc()) // 1
console.log(addFunc()) // 2
console.log(addFunc()) // 3
// 이러한 경우 3개의 렉시컬 환경이 구성.
// 따라서 증가된 값이 반영되지 않음.
console.log(add()) // 1
console.log(add()) // 1
console.log(add()) // 1
'IT > JavaScript' 카테고리의 다른 글
Static (0) | 2022.09.12 |
---|---|
Optional chaining (0) | 2022.08.29 |
Shallow copy && Deep copy (0) | 2022.08.11 |
Functional programming (0) | 2022.08.09 |
Prototype (0) | 2022.08.02 |