Hi, There!
안녕하세요, 바오밥입니다.
목차
- 개요
- 본문
- Reference
개요
자바스크립트(ES6)의 호이스팅과 TDZ에 대해서 정리하였습니다.
본문
변수 (Variable)
ES6 이전에는 var를 사용했고, ES6 이후부터 let과 const 키워드가 사용되기 시작했습니다.
그렇다면 var ↔ let ↔ const 간의 차이점은 무엇일까요?
var ↔ let ↔ const
var 변수는 한 번 선언된 변수를 다시 선언할 수 있습니다.
→ 선언된 변수를 다른 값으로 재선언이 가능합니다.
var name = "defVar"
console.log(name) // defVar
var name = "reDefVar"
console.log(name) // reDefVar
→ let, const는 다른 값으로 재선언이 불가능합니다.
let name = "defVar"
console.log(name) // defVar
let name = "reDefVar" // Uncaught SyntaxError: Identifier 'name' has already been declared
console.log(name) // X
var 변수는 호이스팅으로 인해 선언되기 전에 사용이 가능합니다.
→ 따라서 변수 n은 사용이 가능하지만, n의 값은 정의되지 않았다(undefined)로 출력됩니다.
// 호이스팅에 의해 1번 코드와 2번 코드의 동작은 같습니다.
// 1번 코드
console.log(n) // undefined
var n = 30
// 2번 코드
var n
console.log(n) // undefined
n = 30
→ 변수 선언은 호이스팅 되지만 값 할당은 호이스팅 되지 않습니다.
→ let, const은 TDZ(Temporal Dead Zone)에 의해 호이스팅이 가능한데도 변수 선언이 되지 않습니다.
console.log(name) // Uncaught ReferenceError: Cannot access 'name' before initialization
let name = "jhkim"
호이스팅 (Hoisting)
스코프 내부 어디서든 변수 선언은 최상위에 선언된 것처럼 동작합니다.
TDZ (Temporal Dead Zone)
let, const는 값이 할당 되기 전에는 변수를 사용할 수 없습니다. 즉 let과 const라는 변수가 할당 되기 전의 영역을 말합니다.
// TDZ 예제
// 1번 코드는 TDZ에 영향을 받지 않습니다.
// 2번 코드는 TDZ에 영향을 받습니다.
// 1번 코드
let age = 20;
function showAge() {
console.log(age)
}
showAge() // 20
// 2번 코드
let age = 20;
function showAge() {
console.log(age); // TDZ에 의해 Reference Error가 발생합니다.
let age = 30; // 호이스팅 되지만 값은 나중에 할당됩니다.
}
showAge() // Reference 오류 발생
스코프 (Scope)
스코프는 직역 그대로 범위를 뜻합니다. var는 함수 스코프(function-scoped)이며 let과 const는 블록 스코프(block-scoped) 입니다.
3. 변수의 생성 과정
- 선언 단계 : 변수가 선언되는 단계입니다.
- 초기화 단계 : 변수가 Undefined로 값이 초기화되어 할당되는 단계입니다.
- 할당 단계 : 사용자가 의도한 값으로 값이 할당되는 단계입니다.
3-1) var 변수의 생성 과정
a. 선언 및 초기화 단계
→ 따라서 Reference 오류가 아닌 undefined 값을 반환하는 것입니다.
→ var 변수는 선언 및 초기화 단계가 한 번에 진행됩니다.
b. 할당 단계
3-2) let 변수의 생성 과정
a. 선언 단계
→ 따라서 선언만 호이스팅 되고 초기화가 되지 않아 Reference 오류가 출력됩니다.
→ let 변수는 선언 단계와 초기화 단계가 분리되어 있습니다.
b. 초기화 단계
c. 할당 단계
3-3) const 변수의 생성 과정
a. 선언 및 초기화 및 할당 단계
→ const 변수를 선언만 하는 것은 불가능합니다.
const test; // Uncaught SyntaxError: Missing initializer in const declaration
test = 1;
Reference
'Tech > [Lang] JS & TS' 카테고리의 다른 글
문자열 메서드 (0) | 2021.09.03 |
---|---|
숫자형과 수학 메서드 (0) | 2021.09.02 |
유일성을 보장하는 자료형, 심볼형 (0) | 2021.08.31 |
객체 메서드와 계산된 프로퍼티 (0) | 2021.08.30 |
생성자 함수 (0) | 2021.08.27 |