Chapter 4. 변수(Variable)
javascript 엔진이 코드를 evaluation해야함. 이를 위해선 operator와 literal의 의미를 알고 있어야 하며, expression의 의미를 parsing할 줄 알아야 함.javascript는 직접 메모리에 제어를 허용하지 않음. 허용한다 한들, 메모리의 주소는 매번 실행될 때마다 달라질 것이기 때문에 메모리 주소를 매번 변경할 수 없는 코드에서는 문제가 발생함.Variable이라고 함.Array, Object 같은 자료 구조를 이용한다면, 관련있는 여러 변수들을 그룹화할 수 있음identifier 라고도 함. 함수와 클래스 이름도 마찬가지identifier는 값이 저장된 memory address를 기억. identifier와 memory address 간의 매핑 관계도 저장되어야 함.javascript engine에게 identifier의 존재를 알림allocate하고 identifier와 memory address를 name binding. 해당 공간은 release전까지는 사용할 수 없도록 보호됨var score선언 이후 값의 할당이 없으면 javascript engine에 의해서 undefined가 할당됨. 이 때는 아래 두 단계가 실행됨 - 선언: 변수 이름을 등록해 javascript engine에게 변수의 존재를 알림 - 초기화: 메모리 공간을 확보하고, undefined를 할당해서 초기화
변수 이름의 등록이란?
- 모든 식별자는
execution context에 등록javascript engine이 코드를 평가, 실행하기 위한 환경을 제공. 실행 결과를 관리identifier와scope관리key/value형태인 객체로 관리함
initialize란 선언 이후의 최초 할당garbage value가 남아 사용될 수 있음console.log(score)
var scorejavascript는 interpreter에 의해 한 줄씩 순차 실행. 그러나 실제로 코드를 돌려보면 ReferenceError가 발생하지는 않음javascript engine은 한 줄씩 순차적 실행에 앞서 evaluate를 수행. 모든 선언을 찾아 먼저 실행한 후 선언문을 제외하고 런타임에서 실행함.variable hoisting이라고함var score // declaration
score = 80 // assignment
var score = 80 // declaration & assignmentdeclaration과 assignment 2개의 문으로 나누어서 실행함declaration은 런타임 이전 수행, assignment는 런타임에 실행declaration에 undefined값을 메모리에 저장. assignment 시에 해당 값을 80으로 새롭게 저장하는 것이 아닌, 새로운 메모리 공간을 확보하고 그곳에 80을 저장하는 동작 방식.console.log(score) // ?
score = 80
var score
console.log(score) // ?undefined, 80 이다. var score가 먼저 evaluate단계에서 undefined로 할당. 따라서 첫 번째 로그에는 해당 값으로 할당. 그 다음 줄인 할당을 수행하고 그 다음줄인 선언은 생략. 따라서 마지막 로그는 80을 찍게 됨.var score = 80 // declaration & assignment
score = 90 // re-assignmentvar 키워드로 선언한 변수는 재할당이 가능.undefined와 80은 어떠한 identifier와도 연결되지 않음. 이러한 값들은 garbage collector에 의해 메모리에서 release됨. release시점은 예측할 수 없음.