최근 리액트 생태계, 타입스크립트를 공부하면서 가장 중요한 것은 자바스크립트라는 것을 다시 한 번 느꼈다. 책을 완독한지 3개월 정도가 지났고 개념이 햇갈리는 부분들이 공부 중에 많이 발견되었다. 다시 한 번 기초를 잡기 위해 두 번째 완독을 하면서 꾸준하게 기록을 해보겠다.
기록은 내가 다시 한 번 점검하고 싶은 내용 혹은 중요하다고 생각 되는 개념과 내용 위주로 설명되어 있어 누락이 많을 수 있다.
자바스크립트 엔진이 자바스크립트 코드를 계산(평가-eveluation)하려면 리터럴과 연산자의 의미를 알고 있어야 하며, 10+20이라는 식(표현식)의 의미도 해석(파싱)할 수 있어야한다.
하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.
변수는 프로그래밍언어에서 값을 저장하고 참고하는 매커지즘으로, 값의 위치를 가리키는 상징적인 이름이다.
변수에 값을 저장하는 것
변수에 저장된 값을 읽어 들이는 것
변수 이름
식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다.
식별자는 값이 아니라 메모리 주소를 기억하고 있다.
변수가 메모리 공간 자체이므로 그 공간을 가리키는 주소를 식별할 수 있는 고유한 이름을 식별자라고 할 수 있다.
변수를 사용하려면 반드시 선언이 필요하다. 변수를 선언할 때는 var, let, const 키워드를 사용한다.
var let const에 대한 자세한 내용은 scope와 실행컨텍스트에서 다루겠다.
var score
변수를 선언했을 때의 동작: 실행컨텍스트의 environment record에 score 변수가 등록이 되고 undefined가 할당이 된다.
console.log(score)
var score;
자바스크립트 코드는 인터프리터에 의해 한 줄 씩 순차적으로 실행되므로 console.log(score)가 가장 먼저 실행되고 순차적으로 다음 줄에 있는 코드를 실행한다.
ReferenceError가 발생할 것으로 예상되나 undefined가 출력된다.
이는 변수 선언이 런타임이 아니라 평과 과정에서 먼저 실행 되기 때문이다.
자바스크립트 엔전은 변수 선언을 포함한 모든 선언문(변수, 함수 등)을 소스코드에서 찾아내 먼저 실행한다.
변수에 값을 할당(대입, 저장) 할 때는 =
연산자를 사용한다.
변수 선언과 값의 할당의 실행 시점이 다르다.
변수 선언은 런타임 이전(소스코드 평가 시점)에 실행되지만, 할당은 런타임에 실행된다.
console.log(score);
score = 80;
var score;
console.log(score)
위의 코드가 어떻게 수행 될까? 출력 결과를 예상해보자.
undefined
80
score 변수가 호이스팅되어 평가 시점에 실행되어 undefined가 할당된다. 그러므로 런타임 시 첫 번째 실행 되는 console.log(score)
에서는 undefined
가 출력된다. 라인 순서대로 순차적으로 실행되면서 score 변수에 80이 할당된다. 마지막 console.log(score)
에서는 80
이 출력된다.
console.log(score);
score = 80;
var score = 60
console.log(score)
위의 코드가 어떻게 수행 될까? 출력 결과를 예상해보자.
undefined
60
이미 값이 할당되어 있는 변수에 새로운 값을 또 다시 할당하는 것을 말한다.
값을 재할당 할 수 없어, 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수(constant)라 한다.
상수는 한 번 정해지면 변하지 않는 값이다.
const
키워드를 사용해 선언한 변수는 재할당이 금지된다. 즉, const 키워드는 단 한 번만 할당할 수 있는 변수를 선언한다. 따라서, const 키워드를 사용하면 상수를 표현할 수 있다.
`
garbage collector
애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용 되지 않는 메모리를 해제하는 기능을 말한다. 더이 상 사용되지 않는 메모리란, 어떤 식별자도 참조하지 않는 메모리 공간을 의미한다. 자바스크립트는 가비지 콜렉터를 내장하고 있는 매니지드 언어로서 메모리 누수를 방지하는 기능을 가진다.
weakRef
약한 참조를 걸어서, 참조 count가 없는 상태로 참조를 하고 gc가 동작할 때 바로 수집이 된다.const temp = new WeakRef({ a:1 }) // gc가 동작할 때 temp는 free 된다.
식별자는 다음과 같은 네이밍 규칙을 준수해야 한다.
brower console은 strict mode이다