[Deepdive] 13장 스코프

반응형

📍13장 스코프

스코프

모든 식별자는 자신이 선언된 위치에 의해 다른 코드가 자신을 참조할수이쓴ㄴ 유효 범위가 결정되는데 이를 스코프 라고 한다.

스코프의 종류

  • 전역 스코프
  • 지역스코프

전역스코프

전역스코프는 코드의 가장 바깥 영역을 말한다. 전역에 변수를 선언하면 전연스코프를 갖는 전역변수가 되는데 전역 변수는 어디든지 참조 가 가능하다.

지역스코프

지역은 함수 몸체 내부를 말하는데 지역에서 변수를 선언하면 해당 변수는 지역스코프를 갖게된다. 즉 함수내부에서만 참조할수있다.

스코프 체인

중첩함수에서 스코프는 계층적으로 존재하게되는데 전역 > 함수 > 중첩함수 스코프 가 계층적으로 연결된것을 스코프 체인이라고한다.

변수를 참조할때 자바스크립트 엔진은 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하여 선언된 변수를 검색한다. 이를통해 상위 스코프에서 생성한 변수를 하위 스코프에서도 참조할수있다. 즉 전역 스코프 변수를 중첩스코프 내부에서 사용할수있는 동작원리가 이때문이다.

다만 거꾸로 중첩함수내부에서 상위단계 스코프에서는 참조가 불가능하다

함수레벨 스코프

var 키워드로 선언된 변수는 오로지 함수의 코드블록 만을 지역스코프로 인정한다. 이러한 특성을 함수레벨 스코프라 한다.

var x = 10;
if (true) {
  var x = 1;
}

console.log(x); // 1

var i = 10;
for (var i = 0; i < 5; i++) {
  console.log(i);
}

console.log(i); // 0 1 2 3 4 5

C 나 java 등 대부분의 다른언어는 함수 몸체 뿐만아리나 모든 코드블록 if , for , while , try/catch 등 지역스코프를 만드는데 var 에서는 오로지 함수 만 지역스코프를 인정하기때문에 의도치않게 위 코드와 같이 값이 변경될수있다.

렉시컬 스코프

두가지 패턴을 예측할수있다.

  1. 함수를 어디서 호출했는지 따라 함수 상위 스코프를 결정한다
  2. 함수를 어디서 정의 했는지에 따라 함수 상위 스코프를 결정한다.

프로그래밍은 이 두가지 패턴중 한가지 방식으로 함수 의 상위 스코프를 결정한다.

첫번째 방식은 동적 스코프 라고 하는데 함수를 정의하는 시점에서 함수가 어디서 호출될지 알수없어 함수가 호출되는 시점에 동적으로 상위 스코프를 결정하기에 동적스코프라 한다.

두번째는 렉시컬스코프 또는 정적스코프라고 부른다 동적 스코프처럼 상위 스코프가 동적으로 변하지 않고 함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정되기때문에 정적 스코프라 한다 .

자바스크립트 를 비롯한 대부분의 프로그래밍 언어는 렉시컬 스코프를 따른다

자바스크립으는 렉시컬 스코프를 따르므로 함수를 어디서 호출했는지가 아니라 함수를 어디서 정의했는지에따라 상위 스코프를 결정한다.

var x = 1;
function foo() {
  var x = 10;
  bar();
}

function bar() {
  console.log(x);
}

foo(); // 1
bar(); // 1 
반응형