ES5까지 var은 자바스크립트에서 변수를 선언할 수 있는 유일한 키워드였다.
하지만 var에 어떠한 문제들이 있었는지 ES6에서 let, const라는 키워드가 등장하였다.
대개 새로운 무언가가 만들어지는 이유는 이전의 문제점을 개선하기 위해서이다.
var score;
변수를 선언만 하고 값을 할당하지 않았다. 따라서 변수 선언에 의해 할당된 메모리 공간은 비어 있을 것이라고 생각할 수 있다.
그러나 JS는 undefined라는 값을 할당하여 초기화한다.
(네 정말요..? 👀 변수에 값을 할당하지 않으면 바로 에러가 발생하는 파이썬과 다르게 친절해 보일 수도 있다.)
// 문제! score는 어떤 값을 가질까요?
console.log(score);
var score;
// 정답: undefined
지금까지 Java나 Python에 익숙했던 나로서는 가장 충격적이었던 JS의 특징이다. 보통은 어림도 없다. 선언도 전에 읽으려고 하다니.. 👀
JS 엔진은 변수 선언을 포함한 모든 선언문을 찾아서 런타임 이전 단계에서 먼저 실행하고, 소스 코드를 순차적으로 실행한다.
// 문제!
console.log(score); // undefined (이건 알쥐)
score = 80
var score;
console.log(score); // ??
JS가 주언어가 아닌 사람들이 보기엔 이게 웬 뚱딴지 같은 코드처럼 보일 수도 있다.
지금까지는 늘 선언 후 초기화.. 값 할당 후 참조라는 규칙을 따랐을테니.
그러나 JS는 이 어려운걸 해냅니다! 👏
정답은 80!
// 아하 그러면, 여기에 var score;가 선언된거나 마찬가지구나!
console.log(score); // undefined (JS의 암묵적 초기화)
score = 80 // score 이미 선언 되었으므로 초기화 가능!
var score;
console.log(score); // 80이구나!
다른 언어들이 선언과 초기화와 관련된 일정 규칙을 따르는 이유가 있을텐데, 이대로 사용해도 괜찮은가?
호이스팅 되니까 변수들을 상단이 아니라 아무데서나 선언해도 괜찮겠네! -> 근데 코드 흐름이 이상하지 않나요?
모든 선언문을 런타임 이전에 실행하는데 선언문이 많으면 어떻게 되는거지? -> 느려지지 않을까요?
var x = 1; // 전역 변수
if(true) {
// x는 전역 변수다. 코드 블록 내에서 재선언해도 이미 전역 변수이다.
// 이는 의도치 않게 변수값이 변경되는 부작용이 있다.
var x = 10;
}
console.log(x) // 10
간혹 변수명이 겹치는 경우가 있는데, 지역 변수 전역 변수의 개념이 사라지는게 아닌가?
그것은 다음 챕터에서 밝혀집니다..!
To be continued..😎