엔진은 스코프 버블의 구조와 상대적 위치를 통해 어디를 검색해야 확인자를 찾을 수 있는지 안다.
function foo(a) {
var b = a * 2
function bar(c) {
console.log(a,b,c)
}
bar(b * 3)
}
다음과 같이 함수를 정의 하면 스코프 버블은 3개로 나눌 수 있다.
foo()
가 정의된 글로벌 스코프b
와 bar
가 정의된 foo()
스코프bar()
스코프그럼 어떤식으로 검색이 진행이 될까? bar
함수 내에 a
라는 변수를 log
하려고 값을 찾아 가는 과정을 한번 살펴보자.
bar
스코프에 있는지 확인 한다. -> 없다.foo
스코프에 있는지 확인한다. 있다. 그럼 즉시 검색을 중단하고 그 값을 사용한다.섀도잉
이는 스코프내에 똑같은 이름의 확인자를 여러개 정의 함으로써 확인자를 가릴 수 있다. 즉 가장 안에서 정의된 같은 이름의 확인자가 사용되어 지는것이다.
자바스크립트가 함수기반 스코프를 사용한다.
앞서 보았듯이 함수 내에서 정의된 확인자는 함수내에서 만 사용가능하고 함수 밖에서는 사용이 불가능하다.
이는 스코프의 특성을 이용하는 것으로 외부에 보일필요 없는 것들을 함수에 숨기는 기술이다.
function doSomething(a) {
b = a + doSomethingElse(a * 2)
console.log(b * 3)
}
function doSomethingElse(a) {
return a - 1
}
var b;
doSomething(2) // 15
이런 식으로 함수를 정의하면 우리가 남들에게 보여줄 필요 없는 doSomethingElse
함수도 노출되게 된다.
function doSomething(a) {
function doSomethingElse(a) {
return a - 1
}
var b = a + doSomethingElse(a * 2)
console.log(b * 3)
}
doSomething(2) // 15
이런식으로 doSomethingElse
함수를 doSomething
의 스코프로 옮김으로써 doSomethingElse
를 외부에서 접근할 수 없게 되어서 안전하게 되었다.