3,4장. 변수
메모리란?
데이터를 저장할 수 있는 메모리 셀(memory cell)의 집합체.
메모리 셀 하나의 크기는 1byte(=8bit)이며, 컴퓨터는 1바이트 단위로 데이터를 save 및 read한다.
변수란?
하나의 값을 저장하기 위해 확보한 메모리 공간이다.
할당과 참조의 차이
할당 : 변수에 값을 저장하는것
참조 : 변수에 저장된 값을 읽어들이는 것
식별자
일반적으로 변수의 이름을 식별자라고도 한다.
식별자는 값이 아니라 메모리 주소를 기억하고 있다.
키워드 (var, let, const)
var : ES6이전의 JS 변수 선언 키워드이며, 함수 레벨 스코프를 지원한다. (함수 내부에 선언된 변수 외에는 전부 지역변수 취급함)
let : ES6에서의 변수 선언 키워드이며, 블록 레벨 스코프를 지원한다.
const : ES6에서의 상수 선언 키워드이며, 블록 레벨 스코프를 지원한다.
- var로 선언한 변수는 선언 전에(코드상 위쪽에서) 사용해도 에러가 나지 않지만 let, const는 에러가 난다. (let,const는 초기화를 안해주기 때문이다.)
- var는 이미 선언되어 있는 변수명을 다시 써도 에러가 나지 않는다.
- var, let은 선언 시에 초기값을 주지 않아도 되지만 const는 초기값을 반드시 할당해야 한다.
- const는 상수이므로 한번 할당한 값을 변경할 수 없지만, 객체인경우 객체의 메모리주소를 변경할 수 없을 뿐 내부의 값을 변경 가능하다!(즉, 객체 안의 property가 변경되는것까지는 막지 못한다)
var에 대하여
- 선언 단계 : 변수 이름을 등록해서 JS엔진에 변수의 존재를 알린다.
- 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화한다.
호이스팅
var, let, const, function, function*, class 키워드를 사용하는 모든 식별자는 호이스팅된다.
JS는 코드를 실행하기 전, '코드 평가 과정'을 거치는데, 이 때 변수 선언문을 미리 실행해두기 때문에 나중에 선언된 변수도 앞의 코드에서 참조할 수 있게 된다.
이를 변수 호이스팅이라고 한다.
- var : 코드 평과 가정에서 선언과 (일단 undefined로)초기화 동시에 수행
var foo = 1;
{
console.log(foo); // 1 출력
var foo = 2;
}
/*----------------------------------*/
console.log(foo); // undefined 출력
var foo = 1;
- let, const : 코드 실행 과정에서 변수 선언문을 만났을때 초기화 수행
let foo = 1;
{
console.log(foo); // 블록 내부의 foo가 초기화가 안됐기 때문에 Referrence Error 출력
let foo = 2;
}
/*----------------------------------*/
console.log(foo); // foo가 아직 초기화가 안됐기 때문에 Referrence Error출력
let foo = 1;
let, const는 블록레벨 스코프이므로 블록 안에 있는
let foo = 2;
가 이미 호이스팅 되었기 때문에 블록 바깥의 foo = 1을 출력하지 못한다.
undefined
JavaScript에서 제공하는 원시 타입의 값이다.
6장에서 자세히 다룰것이므로 일단 넘어감!
실행 컨텍스트
- JS엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고, 코드의 실행 결과를 실제로 관리하는 영역이다.
- 식별자와 스코프를 관리한다.
- 변수이름과 값은 K:V 형식으로 등록되어 관리된다. (13장, 23장에서 자세히 다룰것)
값의 재할당
값을 재할당하면 다른 메모리에 값을 재할당한다.
버려진 메모리는 가비지 콜렉터에 의해 자동 해제된다.
단, 언제 해제될지는 예측할 수 없다.
var score = 80; // 변수 선언과 값의 재할당(undefined -> 80)
score = 90; // 값의 재할당