20220829 TIL

엄강우·2022년 8월 29일
0

TIL

목록 보기
41/43

렉시컬 스코프

검색

엔진은 스코프 버블의 구조와 상대적 위치를 통해 어디를 검색해야 확인자를 찾을 수 있는지 안다.

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

다음과 같이 함수를 정의 하면 스코프 버블은 3개로 나눌 수 있다.

  1. foo()가 정의된 글로벌 스코프
  2. bbar가 정의된 foo()스코프
  3. 그리고 bar()스코프

그럼 어떤식으로 검색이 진행이 될까? bar함수 내에 a라는 변수를 log하려고 값을 찾아 가는 과정을 한번 살펴보자.

  1. bar스코프에 있는지 확인 한다. -> 없다.
  2. foo스코프에 있는지 확인한다. 있다. 그럼 즉시 검색을 중단하고 그 값을 사용한다.

섀도잉

이는 스코프내에 똑같은 이름의 확인자를 여러개 정의 함으로써 확인자를 가릴 수 있다. 즉 가장 안에서 정의된 같은 이름의 확인자가 사용되어 지는것이다.

함수 vs 블록 스코프

함수 기반 스코프

자바스크립트가 함수기반 스코프를 사용한다.

앞서 보았듯이 함수 내에서 정의된 확인자는 함수내에서 만 사용가능하고 함수 밖에서는 사용이 불가능하다.

일반 스코프에 숨기기

이는 스코프의 특성을 이용하는 것으로 외부에 보일필요 없는 것들을 함수에 숨기는 기술이다.

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를 외부에서 접근할 수 없게 되어서 안전하게 되었다.

profile
안녕하세요 프론트엔드 개발자를 꿈꾸는 엄강우입니다.

0개의 댓글