
자바스크립트 중급 강좌 #1 - 변수, 호이스팅, TDZ(Temporal Dead Zone)를 보고 학습하였습니다.
자바스크립트의 변수란..? var, const, let을 떠올릴 수 있습니다. 개발 할 때 var는 사용하지 않기에 익숙하지 않은데요. 오늘은 이 변수에 대해 이야기해 보겠습니다.
이 변수들을 각각 어떻게 구분할 수 있을까요?
es6 업데이트가 진행되면서 const와 let이 추가되었습니다. 그렇다면 왜 추가되었을까요? 자바스크립트의 사용 범위가 넓어지면서(백엔드, 게임 등) 안정적인 프로그래밍 언어로써의 기능이 요구되었기 때문입니다.
그런데 왜 안정적인 프로그래밍을 위해 let과 const가 등장했을까? 그것은 바로 var의 특성 때문이다. 혹자는 '그럼 그냥 var를 안정적으로 만들면 안되는건가?'라고 반문할 수 있다. 그러나 이미 서비스되고 있는 웹 중에서는 var를 사용해 개발한 서비스들도 많이 있다. 그렇기에 javascript는 기존 변수의 기능 변경 대신 변수 문법 추가를 택한 것이다.
그럼 무엇이 문제였을까? 바로 호이스팅과 TDZ문제 때문이라고 할 수 있다. 호이스팅은 영어 단어 뜻으로 보자면 '끌어올리는' 정도로 볼 수 있다. 즉 변수를 끌어올리는 동작원리를 말하는 것인데 아래 예시를 살펴보며 이야기 해보자.
// var name; <- 아래에서 선언한 변수도 컴파일 과정에서 '호이스팅' 됨.
console.log(name) // undefined를 반환.
var name = "stephan";
위에서 볼 수 있다시피 코드 아랫줄에서 선언한 변수도 컴파일 과정에서 최상단으로 올라가는 것을 볼 수 있다. 다음 코드도 알아보자.
// let color; <- 컴파일 과정에서 호이스팅이 일어남.
console.log(color) // error
let color = "black";
둘 다 똑같이 호이스팅이 일어나는데 왜 let만 에러가 날까? 그 원인은 바로 호이스팅 시 선언만 되느냐 초기화까지 되느냐의 차이이다. let은 값을 할당할 때 초기화가 되고 var는 선언할 때 기본적으로 undefined로 초기화가 된다. 그런데 아직 우리가 알아보지 않은 const가 있다. const는 선언, 초기화, 할당이 한 번에 일어나야만 한다. 자바스크립트에서 상수 역할을 하고 있으니 당연한 셈인 것이다.
temporal dead zone은 무엇이고 왜 필요할까?
var, const, let은 사실 범위 차이가 있다.
var는 함수 범위로 사용되고 const, let은 블록 범위로 사용된다.