본문 바로가기

개발 일지/JavaScript

호이스팅 과 TDZ

호이스팅에 대해 이야기 하기전에 먼저 변수에  대해 말해보겠습니다. 

변수에는 let, const, var 가 있습니다. (사실 const 는 상수이지만 변수라고 묶어서 표현하겠습니다.)

 

let 과 const 는 ES6 부터 생긴 문법입니다. 

그런데 굳이 var 가 있는데  왜 let 과 const 를 만들었을까요? 

 

var 와 let 은 크게 다르지 않습니다. 

대부분의 경우에는 둘을 바꿔서 사용해도 문제되지 않습니다. 

그럼에도 불구하고 굳이 let을 쓰라는 이유가 뭘까요? 

 

 

var 는 한번 선언된 변수를 다시 선언할 수 있습니다. 

 var name = "Kim";
 console.log(name);
 
 var name = "Park";
 console.log(name);

 

반대로 let은 한번 선언된 변수를 다시 선언할 수 없습니다. 

let name = "Kim";
console.log(name);

let name = "Park";
console.log(name);  / error!!

 

이러한 결과가 나오는것은 var는 선언하기 전에 사용할 수 있습니다. 

console.log(name); // undefined

var name = "Kim";

name을 콘솔 아래로 적었는데도 에러가 나지 않고 언디파인드를 뱉어냈습니다. 

왜냐면 var로 선언한 모든 변수는 코드가 실제로 이동하지 는 않지만  최상위로 끌어올려진 것 처럼 동작합니다. 

 

var name; // hoisting

console.log(name); // undefined

name = "Kim"

이것을 호이스팅이라고 합니다. 

호이스팅은 스코프 내부 어디서든 변수 선언이 최상위에 선언된 것처럼 행동하는 것입니다. 

 

잠깐! 스코프는 뭘까요 ?

Scope 는 우리말로 번역하면 '범위' 라는 뜻을 가지고 있습니다. 즉, 스코프란 '변수의 접근할 수 있는 범위' 라고 할수 있습니다. 

자바스크립트에서 스코프는 2가지 타입이 있습니다. 바로 global(전역) 과 local(지역)인데요, 

전역스코프는 말그대로 전역에 선언되어있어 어디든지 해당 변수에 접근할 수 있다는 것이고, 

지역 스코프는 해당 지역에서만 접근 할 수 있다는 의미 입니다. 

 

자바스크립트에서 함수를 선언하면 새로운 스코프를 생성합니다. 

그러므로 함수 몸체에 선언한 변수는 해당 함수 에서만 접근할 수 있습니다.

이걸 함수 스코프(function-scoped) 라고 하는데,  이것이 지역 스코프의 예라고 할 수 있습니다. 

 

함수 스코프 말고도 블록 스코프 란것도 있는데요 . 블록이란 중괄호 "{ }" 로 둘러싸인 부분을 블록이라고 합니다.  

 

 

다시 돌아와서,

 

호이스팅이 이루어질때  선언은 최상위로 끌어올리지만 할당은 끌어올리지 않습니다. 그렇기 때문에 undefined를 뱉어냅니다. 

name이라는 선언은 호이스팅 되고 값은 그대로 있는 것입니다. 

 

 

 

그렇다면 let 과 const 는 호이스팅 되지 않는것일까요?

아닙니다. 이 둘도 호이스팅이 됩니다.  그러나 Temporal Death Zone (TDZ) 와  스코프에서 차이가 있습니다. 

 

let 과 const 는 TDZ의 영향을 받습니다.

Temporal Death Zone (TDZ) 를 예를 들어서 설명하자면

a가 호이스팅 됬지만 a 선언문이 나오기 전까지는 a 에 접근할 수 없다 라는 존을 만듭니다. 

이것은 코드를 예측가능하게 하고 잠재적인 버그를 줄일 수 있습니다. 

 

 

 

여기서 var는 함수스코프 

var는 함수만 지역변수로 호이스팅이 되고 나머지는 다 전역변수로 올려버립니다. 

 

let 과 const 는 블록스코프 

블록스코프는 위에서 말한것 처럼 중괄호에서 둘러쌓인 부분이 스코프 입니다. 

 

 

 

 

 

 

'개발 일지 > JavaScript' 카테고리의 다른 글

Parameter 와 Argument  (0) 2023.03.28
REST API가 뭔가요  (0) 2023.03.27
웹페이지가 브라우저에 렌더링 되는 과정  (0) 2023.03.27
JavaScript async/await  (0) 2022.12.20
JavaScript Promise  (0) 2022.12.20