You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionouter(){varx=10;// 일반 함수functioninner1(){console.log(x);// 10 출력}// Function 생성자 함수varinner2=newFunction('console.log(x);');inner1();// okinner2();// ReferenceError: x is not defined}outer();
함수 정의가 평가되어 함수 객체를 생성할 때 자신이 정의된 환경(위치)에 의해 결정된 상 위 스코프의 참조를 함수 객체 자신의 내부 슬롯 [[Environment]]에 저장한다. 이때 자신의 내부 슬롯 [[Environment]]에 저장된 상위 스코프의 참조는 현재 실행 중인 실행 컨텍스트의 렉시컬 환경을 가리킨다. - 딥다이브 391p.
일반적인 함수 선언이나 함수 표현식은 그들이 정의된 렉시컬 환경을 [[Environment]] 슬롯에 저장합니다.
반면에, Function 생성자로 만든 함수는 항상 전역 스코프를 [[Environment]] 슬롯에 저장합니다.
클로저는 함수와 그 함수가 선언된 렉시컬 환경과의 조합이다. - 딥다이브 388p.
렉시컬 환경에는 클로저가 생성된 시점의 스코프에 있는 모든 지역 변수가 포함되어 있습니다. Function 생성자로 만든 함수는 항상 전역 스코프를 참조하므로, 생성된 시점의 스코프를 알지 못합니다.
위 예제에서 inner2 함수는 outer 함수 내부에서 선언이 되었지만, outer 함수의 지역 변수인 x에 접근할 수 없습니다.
따라서, Function 생성자 함수로 선언한 함수는 클로저를 생성할 수 없습니다.
🔍 질문 내용
옵저버, 객체를 불변 객체로 전환, ..복사
등에 대한 해결 방법이 궁금해요var value = elem && elem.value;
나elem?.value
나 결국 비슷한 결과가 나오는데 후자가 더 개선된 방법이라고 이해하면 될까요? 각각 어떤 상황에 쓰는게 좋은지 궁금해요함수 선언문은 표현식이 아닌 문이므로 변수에 할당할 수 없다.
에 대한 설명중✨ 기타 내용
The text was updated successfully, but these errors were encountered: