본문 바로가기

IT/JavaScript

Lexical Environment

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

참조: https://ko.javascript.info/closure

'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