3.2.2 기본값은 자체 범위에서 평가된다
배운 것처럼 기본값은 목록의 기본값 이전에 있는 한 다른 매개변수를 참조할 수 있으며, 이전 예의 getDefaultDuration 함수와 같이 외부 범위의 일부인 것을 참조할 수 있다. 하지만 함수 본문 내에 정의된 그 어떤 것도 참조할 수 없으며 호이스트된 것도 참조할 수 없다. 코드 3-3을 실행해 보자.
코드 3-3 기본값은 함수 본문에 있는 엔트리를 참조할 수 없다–default-access-body.js
function example(value = x) {
var x = 42;
console.log(value);
}
example(); // ReferenceError: x is not defined
임시 데드존이 없기 때문에 var를 사용했으며 선언된 범위의 맨 위에 올려진다. 그런데 기본값 표현식은 여전히 사용할 수 없다. 그 이유는 기본값이 함수를 포함하는 범위와 함수 내부 범위 사이에 존재하는 자체 범위에서 평가되기 때문이다(그림 3-1 참조). 함수가 다음과 같이 기본값을 처리하는 다른 함수로 래핑된 것과 같다.
function example(value) {
if (value === undefined) {
value = x;
}
const exampleImplementation = () => {
var x = 42;
console.log(value);
};
return exampleImplementation();
}
example(); // ReferenceError: x is not defined