728x90
코드 실행 시 변수 처리
- 자바스크립트 엔진이 코드를 읽으면, 생성 단계에서 실행 컨텍스트를 생성한다.
- 이 때 함수 선언문은 생성 단계에서 함수 전체가 실행 컨텍스트에 저장된다.
- var 변수는 저장 시 undefined로 초기화된다. (undefined는 엄연히 javascript에서 값이다.)
- let, const는 초기화되지 않는다. (== uninitialized)
Hoisting
console.log(callMe())
//undefined
var x = 10
console.log(callMe()) // 10
function callMe() {
return x
}
- Hoisting은 변수가 선언된 시점보다 앞에서 사용되는 현상이다.
- 이는 var 변수가 생성 단계에서 undefined로 초기화되는 것이 원인이다.
- 함수는 생성 단계에서 함수 전체가 저장되므로 뒤에서 선언되어도 호출이 가능하다.
// ReferenceError: Cannot access 'a'
// before initialization
console.log(callMe())
let x = 10
console.log(callMe()) // 10
function callMe() {
return x
}
- let, const 변수는 생성 단계에서 초기화되지 않는다.
- 선언문 이전에 접근 시 ReferenceError가 발생한다.
- 이 경계를 Temporal Dead Zone(TDZ)라 한다.
- 따라서, let, const는 hoisting이 발생하지 않는다.
var, let, const
- var, let, const 모두 변수를 선언하는 키웓
- var, let은 변수에 재할당이 가능하지만, const는 재할당이 불가능하다.
- var은 함수 스코프, let과 const는 블록 스코프 변수이다.
function varFor() {
for (var i = 0; i < 3; ++i) {
setTimeout(() => console.log("i: ", i), 0);
}
}
function letFor() {
for (let i = 0; i < 3; ++i) {
setTimeout(() => console.log("i: ", i), 0);
}
}
varFor(); // 3 3 3
letFor(); // 0 1 2
- varFor 에서 i는 varFor 함수 범위에 존재하는 변수이다.
- 따라서 setTimeout이 호출될 때, i는 for 블럭이 끝난 시점에 소멸하지 안흔ㄴ다.
- letFor에서 i는 for 블럭 안에 존재하는 변수이다.
- 각 for block이 실행되고 i는 소멸한다. 다만, 이 경우 각 화살표 함수의 closure에 저장된다.
728x90
반응형
'Front-End' 카테고리의 다른 글
[JavaScript] 자바스크립트 제어 흐름 - 비동기 (0) | 2023.04.03 |
---|---|
[JavaScript] 자바스크립트 내장 객체 (0) | 2023.03.30 |
[JavaScript] 자바스크립트 엔진, 변수 정의 과정 (0) | 2023.03.29 |
[JavaScript] ES6 Rest, Spread Operator (0) | 2023.03.25 |
[JavaScript] 자바스크립트 클로저 (Closure) (0) | 2023.03.24 |