렉시컬 스코프와 관련하여 결과가 직관적이지 않은 코드를 마주쳐 기록 및 분석하였습니다.
let foo = () => console.log('foo');
// 단축 속성을 이용한 객체 리터럴 선언
const a = { foo };
// 함수로 초기화된 속성을 가진 객체 리터럴 선언
const b = {
foo: () => foo();
};
// 메서드를 이용한 객체 리터럴 선언
const c = {
bar() {
foo();
}
}
a.foo(); // foo
b.foo(); // foo
c.foo(); // foo
foo = () => console.log('new foo');
a.foo(); // foo
b.foo(); // new foo
c.bar(); // new foo
b.foo()
)에야 렉시컬 스코프가 결정되기 때문에(lazy-load) foo 속성은 재할당된 foo 함수를 참조할 수 있습니다. (속성이 호출되어야 익명함수의 평가를 시작할 수 있기 때문입니다)[[HomeObject]]
슬롯을 이용)되기 때문에 super 키워드를 지원한다. 이때 super 키워드는 자신을 바인딩하고 있는 객체의 prototype을 가리킨다.[[HomeObject]]
슬롯은 메서드가 super을 사용하는지 여부와 관계없이 존재하긴 하나, 실제적으로 super을 사용하지 않았으면 엔진이 이 링크([[HomeObject]]
를 통한 메서드와 바인딩 객체의 연결)를 최적화할 가능성이 있다고 한다. (웹 개발자를 위한 자바스크립트의 모든 것, 2022)
유익한 자료 감사합니다.