javascript-11: closer
closer
어휘적 환경 (Lexical Enviroment)
- 자바스크립트는 어휘적 환경을 갖는다.
- 위에서부터 아래로 동작
- 스크립트 내에서 선언한 변수들이 lexical 환경에 올라감
- 현재 one은 초기화가 안되어있어서 사용불가, 함수선언문은 바로 초기화 되서 사용가능
- let one을 만나서 사용은 가능하지만 ,값이 할당 되어있지 않기때문에 undefined
- one 에 숫자 1이 할당 됨.
- 함수 실행.
- 새로운 렉시컬 환경 만들어짐
- addOne(5)이 저장됨.
- 함수에서 만들어진 내부 렉시컬 환경과 외부에서 만들어진 전역 렉시컬 환경이 만들어짐
- 내부렉시컬환경은 외부 렉시컬 환경에 대한 참조를 가짐.
- 코드에서 변수를 찾을때 내부에서 찾고, 없으면 외부, 없으면 전역 레시컬 환경에서 찾음
- one과 num을 내부에서 찾음. num은 있지만, one은 없어서 외부로 감. 외부에서 찾아서 더함
- makeAdder랑 add3은 전역레시컬 환경에 들어감
- add3은 초기화 x 사용 x
- const add3 = makeAdder(3); 의 함수 차례가 오면
- function makeAdder가 실행되고 makeAdder의 렉시컬 환경이 만들어짐
- 여기서 전달받은 x의 값이 들어감
- 함수의 렉시컬 환경에는 넘겨받은 매개변수와 지역변수들이 저장됨.
- 전역 레시컬 환경이었던 add3은 makeAdder이 실행되었으니 리턴하는 함수가 됨
- 마지막 줄이 실행되면, mak0eAdder(x){ }함수가 실행되는데, 이때 또 렉시컬 환경이 만들어짐. y가 2로 들어감.
- x+y를 하는데, 처음엔 익명함수 렉시컬 환경에서 부터 찾아감. y는 있는데 x는 없음.
- makeAdder 렉시컬 환경에서 찾음. x를 찾음
- 이 함수는 자신이 y를 가지고 있고 상위 함수인 makeAdder의 매개변수 x에 접근할 수 있음.
- 외부함수의 실행이 끝나서 외부함수가 소멸된 이후 에도 내부함수가 외부함수의 변수에 접근할 수 있음
- makeAdder10을 호출하지만 add3에는 영향이없음. add3과 add10은 다른 렉시컬 환경을 가지고있음.
- 내부함수에서 외부함수의 변수에 접근할 수있음.
- 함수가 진행될때 내부함수는 외부함수의 변수들을 기억하고(잊지 않고) 계속 접근 가능
- 결국 클로저는 스코프(각 함수마다 존재, 변수 명들의 집합)를 계속 들고 있는 거 군요?
- 원래는 함수 내부에 선언한 변수는 함수가 끝나면 사라지지만, 클로저가 스코프를 계속 들고 있으므로 그 함수 내부의 변수를 참조할 수 있게 됨!
댓글남기기