- 런타임
소스코드가 순차적으로 실행되는 시점을 말한다.- 변수 호이스팅
자바스크립트 엔진은 변수 선언이 어디 있는 상관없이 다른 코드보다 먼저 실행한다. 즉, 변수 선언문이 끌어 올려진 것처럼 동작하는 특징을 변수 호이스팅이라고 한다.
아래의 예를 보자
console.log(s); //undefined var s; //변수 선언 s = 80; // 값의 할당 console.log(s); //80
위에서 설명한 변수 호이스팅이 일어나게 되는데 변수의 선언은 런타임 이전에 실행되고 값의 할당은 런타임에 실행된다.
그렇다면 아래와 같이 변수의 선언과 값의 할당을 동시에 한다면?
console.log(s); //undefined var s = 80; //변수 선언과 동시에 할당 console.log(s); //80
결과는 마찬가지이다. 자바스크립트 엔진은 변수의 선언과 값의 할당을 2개의 문으로 나누어 각각 실행하기 때문이다.
편의상 javascript를 JS로 표기하기로 약속하고 글을 써보겠다.
JS엔진은 변수 선언시 런타임전에 변수를 undefined로 초기화하는 특징을 가졌다. 따라서 만약 변수를 참조시 undefined가 반환되었다면 변수는 선언 후 값이 할당되지 않은 상태를 나타낸다.
또한 JS엔진이 변수 초기화를 undefined로 하므로 개발자는 의도적으로 변수에 undefined를 할당하지 않는 것이 좋다.
만약 변수에 값이 없다는 것을 명시하고 싶다면 null을 사용하자!
- 변수가 선언되면 변수의 이름(식별자)에 메모리 주소를 기억시키고 그 주소의 공간에 undefined로 초기화 한다.
- 변수에 값이 할당되면 1번 주소의 메모리 공간에 값이 저장된다고 생각하겠지만 아니다!
새로운 메모리 주소에 있는 메모리 공간을 확보하고 할당된 값을 저장한다- 마찬가지로 만약 값의 재할당이 일어난다면 2번과 같은 과정을 거치게 된다.
이런 의문이 들 수 있다.
값의 할당 또는 재할당이 일어나면 기존에 있던 메모리 공간은 가비지 콜렉터에 의해 메모리에서 자동으로 해제된다.
단, 언제 메모리에서 해제될지 모른다.
가비지 콜렉터란?
어플리케이션이 할당한 메모리 공간을 주기적으로 검사하여
더이상 사용되지 않는 메모리를 해제하는 기능을 말한다.
추가적으로
자바스크립트는 Managed Language 이기 때문에 메모리의 할당 및 해제를 위한 메모리 관리를 개발자가 직접 제어하는 것을 허용하지 않고 언어 차원에서 자동으로 메모리를 관리한다.
(이에대한 장단점이 존재한다.)
처음 작성을 해서 미숙한 부분이 있지만 앞으로는 더욱 간결하고 보기 좋게 작성해야겠다는 생각을 했다.
다른 분들께 도움이 되었으면 좋겠다!