📌 스코프가 작동하는 두가지 방식
렉시컬 스코프 : 개발자가 코드를 짤 때 변수와 스코프 블록을 어디서 작성하는가에 기초하여 렉서가 처리할 때 확정
//1
function foo() {
//2
var b = a * 2;
function bar(c); {
//3
console.log( a, b, c);
}
bar( b * 3 )'
}
foo( 2 ); // 2, 4, 12
⇒ 3개의 중첩 스코프
📍 어떤 함수의 버블도 동시에 다른 두 스코프 버블 안에 존재할 수 없음
: 엔진이 스코프 버블의 구조와 상대적 위치를 통해 어디를 검색해야하는지에 대한 정보
📍 스코프 : 목표와 일치하는 대상을 찾는 즉시 검색 중단
📍 섀도잉 : 여러 중첩 스코프 층에 걸쳐 같은 확인자 이름 정의
📍 렉시컬 스코프는 함수가 선언된 위치에 따라 정의
: 인자로 문자열을 받아 런타임에 문자열 내용을 코드의 일부분처럼 처리
→ 호출된 위치에 있는 렉시컬 스코프 수정
: 한 객체의 여러 속성을 참조할 때 객체 참조를 매번 반복하지 않기 위해 사용하는 속기법
function foo(obj) {
with (obj) {
a=2;
}
}
var o1 = {
a: 2
};
var o2 = {
b: 3
};
foo( o1 );
console.log( o1.a ); //2
foo( o2 );
console.log( o2.a ); // undefined
console.log( a ); // 2--0ops, leaked global!
⇒ with 문은 o1이라는 스코프를 선언하고 그 스코프는 o1.a 속성에 해당하는 확인자를 가짐
⚠️ eval과 with모두 권장하지 않는 문이다
하지만 코드에 이 두개가 있다면 최적화 없이는 코드가 느리게 동작할거 라는 것 명심!