Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Joon's Space

[JavaScript] 변수, 호이스팅, TDZ 본문

Web/JS

[JavaScript] 변수, 호이스팅, TDZ

Happy Joon 2022. 7. 15. 17:21

변수

- 한번 선언된 변수를 다시 선언할 수 있다. (let은 두 번 선언할 시에 error 발생)

var name = "Mike"; 
console.log(name); // Mike

var name = "Jane";
console.log(name); // Jane

- 선언하기 전에 사용할 수 있다. -> 호이스팅(hoisting) 선언은 호이스팅 되지만, 할당은 호이스팅 되지 않는다. 

 

호이스팅 이란? 

스코프 내부 어디서든 변수 선언은 최상위에 선언된 것처럼 행동

var name; 

console.log(name); // undefined 할당은 호이스팅 되지 않기때문에 값은 undefined

name = 'Mike'; // 할당
console.log(name); // ReferenceError
let name = 'Mike';

위와 같이 var는 호이스팅 되지만, let의 경우에는 error를 출력한다. 

let, const 도 호이스팅이 되지만, let이 할당받기 전의 영역은 Temporal Dead Zone(TDZ)의 영향을 받아 변수를 사용할 수 없다.

-> 코드를 예측 가능하게 하고, 잠재적인 버그를 줄일 수 있음. 

 

 

자바스크립트에서 변수의 생성과정

크게 다음과 같은 3가지로 나눌 수 있는데, 

1. 선언 단계

2. 초기화 단계

3. 할당 단계

 

var는 선언 단계와 초기화 단계가 동시에 일어난다. -> undefined로 초기화 

 

let은 선언 단계와 초기화 단계가 분리되어 진행된다. -> 실제 코드에 도달했을 때, 초기화가 진행되기 때문에 위처럼 reference error를 발생시킨다.

 

const는 1. 선언 + 초기화 + 할당이 동시에 일어나 (var, let처럼 선언, 초기화를 하고 할당을 나중에 할 수 없음)

let name;
name = 'Mike';

var age;
age = 30;

const gender;
gender = 'male'; // 선언 하면서 할당을 하지 않아 Syntax Error 발생

 

var

: 함수 스코프(function-scoped) -> 함수 내에서 사용한 변수는 그 함수 내에서만 지역변수가 된다.

 

 

let, const

: 블록 스코프(block-scoped) -> 블록 단위 내에서만 let, const로 선언된 변수(블록 내 지역변수)를 사용 가능하다. (try-catch, if, for, while문 등)

 

// 블럭 스코프

const age = 30;
if(age>19) {
	var txt = '성인'
}
console.log(txt); // 성인

txt가 let, const로 선언되면 if 블록 중괄호 안에서만 사용 가능

// 함수 스코프

function add(num1, num2) {
    var result = num1 + num2;
}
add(2, 3);
console.log(result); // ReferenceError

var로 선언된 변수는 함수 밖에서 사용될 수 없다. -> 유일하게 벗어날 수 없는 scope는 함수라고 생각하자.

반응형

'Web > JS' 카테고리의 다른 글

[JavaScript] 생성자 함수  (0) 2022.07.15
[GraphQL] GraphQL 개념 (Query, Resolver, Schema, Mutation)  (0) 2021.08.29