어휘 범위
일반적인 상황에서 JavaScript의 어휘 범위는 변수가 선언된 코드의 위치에 따라 결정됩니다. 이러한 범위는 코드 작성 단계에서 결정되며 런타임에 변경되지 않습니다. 정적 범위 지정의 이러한 특성 덕분에 변수의 동작과 범위를 보다 안정적으로 예측할 수 있습니다.
어휘 범위를 스푸핑하는 방법 2.
어휘 범위가 코드 작성 중에 함수가 선언된 위치로만 정의된다면 런타임에 어떻게 "수정"할 수 있을까요? JavaScript에는 이를 달성하기 위한 두 가지 메커니즘이 있습니다. 코드에서 이러한 메커니즘 중 하나를 사용하는 것은 좋지 않다는 일반적인 합의가 있습니다. 가장 중요한 이유는 어휘 범위를 스푸핑하면 성능 저하로 이어지기 때문입니다.
eval
eval 함수는 자바스크립트 코드가 포함된 문자열을 실행하는 강력하지만 위험한 도구입니다. eval에서 변수를 선언하면 런타임에 어휘 범위를 수정할 수 있습니다.
function createVariableWithEval() {
eval("var localVar = 'I am inside eval';");
console.log(localVar); // : I am inside eval
}
createVariableWithEval();
console.log(localVar); // : I am inside eval
with
with 문을 사용하면 범위 체인의 일부로 간주되는 특정 객체에서 문 블록을 실행할 수 있습니다. 엄격 모드에서는 with가 비활성화되지만 비엄격 모드에서는 어휘 범위를 스푸핑하는 데 사용할 수 있습니다.
var obj = { prop: "I am inside with" };
with (obj) {
console.log(prop); // : I am inside with
}
console.log(prop); // : I am inside with
요약
eval() 및 with()는 작성 시점에 정의된 다른 어휘 범위를 스푸핑하는 방법으로 런타임에 새 범위를 수정하거나 생성합니다. 그러나 이 두 가지 메커니즘의 부작용은 둘 중 하나를 사용하면 코드 실행 속도가 느려진다는 것입니다.




