JavaScript의 호이스팅, 클로저
JavaScript가 이상해요
Hoisting and Closer
JavaScript 실행 단계
- 컴파일: 변수, 함수 선언을 코드가 실행되기 전에 메모리에 등록
- 실행: 코드가 순차적으로 실행되며 실제로 변수, 함수를 사용
Hoisting (호이스팅)
- Hoist:끌어올리다.
- 코드가 실행 되기 전, 필요한 메모리 공간을 확보하여 예기치 못한 오류를 막기 위해 실행.
변수
- scope단위로 변수, 함수의 선언과 할당이 분리되어 식별자가 우선 선언된 것 같은 현상.
- 왜냐하면… Javscript 엔진 구동시
선언
이 최우선으로 해석되기 때문이다. 할당은 실제 코드 실행 시 동작함. - var: 변수 객체 등록 후 메모리 할당(undifined로 초기화)까지 호이스팅 됨. 즉, 초기화나 할당 전에도 이미 undifined로 초기화 되어 메모리가 할당되어있기에 접근 가능.
- let, const: 변수 객체 등록 까지만 진행됨. 따라서 선언 지점 전에 참조하면 오류 발생.
-
TDZ(Temporal Dead Zone): 스코프 시작 지점부터 초기화 지점까지의 구간
-
함수
- 함수 선언식: 함수 식까지 호이스팅 됨
funciton example(){
console.log('함수 선언식' )
}
- 함수 표현식: var example 변수는 호이스팅 되지만 함수는 할당되기 전까지 참조 불가.
var example= function() {
console.log('함수 표현식');
}
Closure(클로저)
- 함수가 함수를 반환할 때, 그 반환되는 함수가 자신을 둘러싼 메모리 환경도 가지고 반환하는 것. 따라서 함수가 스코프 밖에서 실행될 때에도 접근 가능하다.
- 전역 변수의 남용을 막고 캡슐화, 은닉화를 자바스크립트로 구현하기 위해 존재함.