1 분 소요

closer

어휘적 환경 (Lexical Enviroment)

image

  • 자바스크립트는 어휘적 환경을 갖는다.
  • 위에서부터 아래로 동작
  • 스크립트 내에서 선언한 변수들이 lexical 환경에 올라감
  • 현재 one은 초기화가 안되어있어서 사용불가, 함수선언문은 바로 초기화 되서 사용가능

image

  • let one을 만나서 사용은 가능하지만 ,값이 할당 되어있지 않기때문에 undefined

image

  • one 에 숫자 1이 할당 됨.

image

  1. 함수 실행.
  2. 새로운 렉시컬 환경 만들어짐
  3. addOne(5)이 저장됨.
  4. 함수에서 만들어진 내부 렉시컬 환경과 외부에서 만들어진 전역 렉시컬 환경이 만들어짐
  5. 내부렉시컬환경은 외부 렉시컬 환경에 대한 참조를 가짐.
  6. 코드에서 변수를 찾을때 내부에서 찾고, 없으면 외부, 없으면 전역 레시컬 환경에서 찾음
  7. one과 num을 내부에서 찾음. num은 있지만, one은 없어서 외부로 감. 외부에서 찾아서 더함

image

  • makeAdder랑 add3은 전역레시컬 환경에 들어감
  • add3은 초기화 x 사용 x

image

  1. const add3 = makeAdder(3); 의 함수 차례가 오면
  2. function makeAdder가 실행되고 makeAdder의 렉시컬 환경이 만들어짐
  3. 여기서 전달받은 x의 값이 들어감
  4. 함수의 렉시컬 환경에는 넘겨받은 매개변수와 지역변수들이 저장됨.

image

  1. 전역 레시컬 환경이었던 add3은 makeAdder이 실행되었으니 리턴하는 함수가 됨

image

  1. 마지막 줄이 실행되면, mak0eAdder(x){ }함수가 실행되는데, 이때 또 렉시컬 환경이 만들어짐. y가 2로 들어감.

image

  1. x+y를 하는데, 처음엔 익명함수 렉시컬 환경에서 부터 찾아감. y는 있는데 x는 없음.
  2. makeAdder 렉시컬 환경에서 찾음. x를 찾음

image

  1. 이 함수는 자신이 y를 가지고 있고 상위 함수인 makeAdder의 매개변수 x에 접근할 수 있음.

image

  1. 외부함수의 실행이 끝나서 외부함수가 소멸된 이후 에도 내부함수가 외부함수의 변수에 접근할 수 있음

image

  1. makeAdder10을 호출하지만 add3에는 영향이없음. add3과 add10은 다른 렉시컬 환경을 가지고있음.

image

  • 내부함수에서 외부함수의 변수에 접근할 수있음.
  • 함수가 진행될때 내부함수는 외부함수의 변수들을 기억하고(잊지 않고) 계속 접근 가능
  • 결국 클로저는 스코프(각 함수마다 존재, 변수 명들의 집합)를 계속 들고 있는 거 군요?
  • 원래는 함수 내부에 선언한 변수는 함수가 끝나면 사라지지만, 클로저가 스코프를 계속 들고 있으므로 그 함수 내부의 변수를 참조할 수 있게 됨!

댓글남기기