변수 이름은 어디에 등록되는가?
변수 이름을 비롯한 모든 식별자는 실행 컨텍스트에 등록된다. 실행 컨텍스트(execution context)는 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다. 자바스크립트 엔진은 실행 컨텐스트를 통해 식별자와 스코프를 관리한다.
변수 이름과 변수 값은 실행 컨텍스트 내에 키(key) / 값 (value) 형식인 객체로 등록되어 관리된다. 자바스크립트 엔진이 변수를 관리하는 메커니즘은 13장 "스코프"와 23장 "실행 컨텍스트"에서 자세히 살펴볼 것이다. 지금은 단순히 자바스크립트 엔진이 변수를 관리할 수 있도록 변수의 존재를 알린다는 정도로만 알아두자.
WeakRef()
ES2021에서 나온 새로운 문법이다. WeakRef 개체를 사용하면 해당 개체가 가비지 수집되는 것을 방지하지 않고 다른 개체에 대한 약한 참조를 유지할 수 있다. 대조적으로 일반(또는 강력한 ) 참조는 개체를 메모리에 유지한다. 객체에 더 이상 강력한 참조가 없으면 JavaScript 엔진의 가비지 수집기가 객체를 파괴하고 메모리를 회수할 수 있다. 그런 일이 발생하면 더 이상 약한 참조에서 개체를 가져올 수 없다.
weekRef 객체는 가능한 사용하지 않는 것이 좋다.
표현식인 문과 표현식이 아닌 문
표현식인 문과 표현식이 아닌 문을 구별하는 가장 간단하고 명료한 방법은 변수에 할당해 보는 것이다. 표현식인 문은 값으로 평가되므로 변수에 할당할 수 있다. 하지만 표현식이 아닌 문은 값으로 평가할 수 없으므로 변수에 할당하면 에러가 발생한다.
// 표현식이 아닌 문은 값처럼 사용할 수 없다
var foo = var x; //SyntaxError : Unexpected token var
// 변수 선언문은 표현식이 아닌 문이다.
var x;
// 할당문은 그 자체가 표현식이지만 완전한 문이기도 하다. 즉, 할당문은 표현식인 문이다.
x = 100;
완료 값(completion value)
크롭 개발자 도구에서 표현식이 아닌 문을 실행하면 언제나 undefined 를 출력한다. 이를 완료 값이라 한다. 완료 값은 표현식의 평가 결과가 아니다. 따라서 다른 값과 같이 변수에 할당할 수 없고 참조할 수도 없다.
개발자 도구에서 표현식이 아닌 문을 실행하면 완료 값 undefined를 출력한다.
크롬 개발자 도구에서 표현식인 문을 실행하면 언제나 평가된 값을 반환한다.
'모던 자바스크립트 Deep Dive' 카테고리의 다른 글
[Deep Dive] 실행 컨텍스트 (0) | 2022.10.14 |
---|
Comment