[Deep Dive-4장 변수] var, let, const

chxxrin·2023년 8월 2일
0

DeepDive

목록 보기
1/2

javascript 변수 호이스팅

모든 선언문은 런타임 이전 단계에서 먼저 실행된다.

console.log(score); //undefined
var score; 

변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만, 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.

console.log(score); //undefined
var score; //(1)변수 선언
score = 80; //(2)변수 할당
console.log(score); //80

자바스크립트는 소스코드를 실행하기 전에 평가과정에서 모든 선언문을 소스코드에서 찾아내 먼저 실행한다. 그리고 나서, 선언문을 제외한 소스코드를 한 줄씩 순차적으로 실행한다. 즉, 변수 선언이 소스코드가 한 줄씩 순차적으로 실행되는 시점인 런타임이 아니라 그 이전 단계에서 먼저 실행이 된다. 그러므로 변수 선언이 소스코드에 어디에 있든지간에 다른 코드보다 먼저 실행하게 되므로 어디서든지 변수를 참조할 수 있다. 이처럼 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅(variable hoisting)이라고 한다.

(1)변수 선언은 런타임 이전에 먼저 실행되기 때문에 먼저 컴퓨터는 score라는 변수를 선언을 했지만 아직 값은 할당되지 않아 undefined로 초기화가 된다. 그래서 현재는 score에는 undefined가 저장되어 순차적으로 소스코드를 실행할 때, 첫번째 console.log(score)에는 undefined가 출력이 된다. 그러나, 그 다음에 (2)변수 할당에서 80을 할당 받고 나면 score은 80을 저장하게 된다. 그래서 두번째 console.log(score)에는 80이 출력된다. 그리고, 변수를 할당할 때는 undefined가 저장되어 있던 메모리 공간을 지우고, 그 자리에 들어가는게 아니라 새로운 메모리 공간을 확보하고, 그 곳에 80을 저장하는 것이다.

var

선언 단계와 초기화 단계가 동시에 진행된다.

var score; //undefined으로 초기화

선언 단계를 통해 변수 이름 score를 등록하고, 초기화 단계를 통해 score 변수에 암묵적으로 undefined를 할당해 자동으로 초기화한다. 즉, 따로 값을 할당하지 않아도 undefined 라는 값을 가진다. 보통은 초기화 단계를 거치지 않으면 확보된 메모리 공간에는 다른 애플리케이션이 사용했던 남은 값인 쓰레기 값(garbage value)이 남아 있을 수 있다. 그래서 메모리 공간을 확보한 다음에 값을 선언만 하고 초기화를 하지 않고 변수 값을 참조하면 쓰레기 값이 나올 수 있다. 하지만, var은 암묵적으로 초기화를 수행하므로 이런 위험으로부터 안전하다.

값을 재할당할 수 있다.

var score = 80; //변수 선언과 값의 할당
score = 90; //값의 재할당

값을 재할당 할때는 80이 저장되어 있던 메모리 공간을 지우고, 그 자리에 들어가는게 아니라 새로운 메모리 공간을 확보하고, 그 곳에 90을 저장하는 것이다. 그러면 이전 값인 undefined와 80은 어떤 변수도 값으로 갖고 있지 않은, 불필요한 값이다. 이런 불필요한 값들은 가비지 콜렉터(garbage collector)에 의해 메모리에서 자동 해제된다. 단, 그 시점은 알 수 없다. 이를 통해 메모리 누수를 방지한다.

const (상수)

재할당 금지 (에러남)

let

재할당 가능

0개의 댓글