ES6 이전의 javascript 변수 선언에는
유일하게var
키워드 만을 사용할 수 있었으나, ES6(ECMAscript2015)
이후의 자바스크립트는let
과const
의 키워드를 추가적으로 갖게 됨
ES6등장 이후 변수 선언에서의var
는 권고되지 않고 있으며,
변수의 선언으로let
상수의 선언으로const
를 사용하는 추세.
ES6이전 변수를 선언하던 방식인
var
를 사용했을 때 대표적인 단점은 다음과 같다.
- hoisting
var
키워드는 순차적으로 실행되는 자바스크립트 환경에서, 다음과 같이
예상치 못한 결과를 초래한다. var키워드는 자바스크립트가 돌아가는 런타임 이전에
실행되기 때문.console.log(foo) //undefined var foo = 'bar';
- function level scope
var
키워드는 블록 단위를 가지는 다른 선언 키워드와는 다르게
함수 단위의 범위를 갖게 된다.{ var bar = 'foo'; } console.log(bar) //'foo'
let foo = 'bar';
다음과 같은 변수의 선언식은 두가지 동작을 연속적으로 하게 되며, 그 동작은 다음과 같다.
let foo; foo = 'bar';
let foo = 'bar';
와 같은 동작을 수행할 때 자바스크립트는 식별자 foo의 메모리 공간을 먼저 확보 후, 해당값에undefined
를 할당하게 된다. 그 후, 'bar'를 재할당 하게 된다.let bar; console.log(bar) // undefined
변수에 어떠한 값을 할당하지 않는다 해도, 자바스크립트는 자동으로 해당 변수에
undefined
를 할당한다.
자바스크립트에서의 변수에 데이터를 재할당 하는 작업은, 해당 메모리 공간을 지우고, 그 메모리 공간에 재할당 값을 저장하는 것이 아닌, 새로운 메모리 공간을 확보 후 그 메모리에 재할당하는 데이터를 기록후 식별자, 즉 변수의 이름을 새로 할당 해 준다.
위와 같이 값의 재할당이 일어날 때, 식별자(변수 이름)이 사라져 더이상 접근할 수 없는 데이터가 남게 되는데, 이 데이터의 경우 무한정 메모리에 쌓이는 것이 아닌 가비지 컬렉터 (garbage collector)에 의해 자동으로 메모리에서 해제 된다.
해당 가비지 컬렉터가 런타임의 어느 시점에 동작 하는지는 알 수 없다.
단순한 변수 뿐만 아니라, 외부에서 더이상 접근할 수 없게된 데이터는 모두
가비지 컬렉터에 의해 제거되어, 메모리 누수를 방지한다.
- 가비지 컬렉션은 엔진이 자동으로 수행하므로 개발자는 이를 억지로 실행하거나 막을 수 없다.
- 각 자바스크립트 엔진마다, 가비지 컬렉터의 알고리즘과 작동 방식이 상이하다.