YeonjuOHYE / javascript

0 stars 0 forks source link

유돈노 #part2#2) 렉시컬 스코프 #12

Open YeonjuOHYE opened 5 years ago

YeonjuOHYE commented 5 years ago

2.1 렉스 타임

렉시컬 스코프는 렉싱 타임에 정의되는 스코프 렉시컬 스코프는 프로그래머가 코드를 짤 때 변수와 스코프 블록을 어디서 작성하는가에 기초해서 렉서가 코드를 처리할 때 확정

function foo(a) {
var b = a * 2;
function bar(c) {
  console.log(a,b,c);
}
bar(b * 3);
}
foo(2); 

위의 경우에는 총 3개의 스코프가 있다.

2.1.1 검색

엔진은 스코프 버블의 구조와 상대적 위치를 통해 어디를 검색해야 확인자를 찾는다. (Q. 섀도잉은 대체 왜써...) 스코프 검색은 항상 실행 시점에서 가장 안쪽 스코프에서 시작하여 최초 목표와 일치하는 대상을 찾으면 멈추고, 그전까지는 바깥/위로 올라가면서 수행

※ 어떤 함수가 어디서 호출되는지에 상관 없이 함수의 렉시컬 스코프는 함수가 선언된 위치에 따라 정의

2.2 렉시컬 속이기

어떻게 런타임에 스코프를 수정할 수 있는가?!

1)eval

function foo(str, a) {
eval(str);
console.log(a,b);
}

var b =2;
foo("var b = 3",  1); // 1,3 

2)with with는 속기 함수

var obj = {
a : 1,
b: 2,
c : 3,
}

obj.a = 2;
obj.b = 3;
obj.c = 4;

with(obj) {
a= 3;
b= 4;
c = 5;
}

with로 런타임때 스코프 변경하는 예제

function foo(obj) {
 with(obj) {
  a = 2;
 }
}

var o1 = {
a : 3
}

var o2 = {
b: 3
}

foo(o1);
console.log(o1.a); //2

foo(o2);
console.log(o2.a); //undefined
console.log(a);//2 

왜 이런 말도 안되는 결과가 나왔는가... with문은 속성을 가진 객체를 받아 마치 하나의 독립된 렉시컬 스코프처럼 취급 객체의 속성은 모두 해당 스코프 안에 정의된 확인자로 간주 with 블록안에서 선언문이 선언되면 선언된 변수는 with 블록이 아니라 with를 포함하는 함수의 스코프에 속한다.

이러한 이유로 with문에 o2가 사용되면 그 스코프에 a 확인자가 없으므로 이후 작업은 일반적인 LHS 확인자 검색 규칙에 따른다.

o2 스코프, foo스코프 글로벌 스코프에서도 a 확인자 없으므로 a=2; 실행되고 이에 해당하는 글로벌 변수가 생성된다.