스코프

`·2022년 2월 13일

Scope

‘변수에 접근할 수 있는 범위’라고 할 수 있다.
자바스크립트에서 스코프는 2가지 타입이 있다. 바로 global(전역)과 local(지역) 이다.

  • 전역 스코프(Global Scope) : 말 그대로 전역에 선언되어있어 어느 곳에서든지 해당 변수에 접근할 수 있다는 의미이다.

  • 지역 스코프(Local Scope) : 해당 지역에서만 접근할 수 있어 지역을 벗어난 곳에선 접근할 수 없다는 의미입니다.

  • 함수 스코프(function-scoped) : 함수를 선언할 때마다 새로운 스코프를 생성하게 되는데, 그러므로 함수 안에서 선언한 변수는 해당 함수 안에서만 접근할 수 있다. 이는 지역 스코프의 예라고 할 수 있다.


Scope Chain

내부 함수에서는 외부 함수의 변수에 접근 가능하지만 외부 함수에서는 내부 함수의 변수에 접근할 수 없다.

var a = 1; // 전역 스코프
function print() { // 지역(함수) 스코프
 var a = 111;
 console.log(a);
}
print(); // 111
console.log(a); // 
  • 위의 코드에서, print() 가 실행될 떄 먼저 자신의 함수 스코프 안에 변수 a가 있는지 찾아 볼 것이다. var a = 111을 찾아냈으므로 111이 콘솔에 출력된다.
  • 반면, print() 함수 밖에 실행된 console.log(a)는 함수 스코프가 아닌 전역 스코프로 선언된 var a = 1을 참조하여 1이 콘솔에 출력된다.

var a = 1; // 전역 스코프
function print() { // 함수 스코프
 console.log(a);
}
print(); // 1
  • 위의 코드와 같이, print 함수 안에 변수 a의 선언을 지운다면 p전역 스코프에 선언되어있는 a의 값인 1이 출력되는 것을 확인할 수 있다. 이는 Scope Chain에 의해 일어나는 현상이다. 현재 자신의 scope에서 사용하고자 하는 변수가 없다면 Scope Chain을 통해 해당 변수를 찾게됩는 것이다

렉시컬 스코프

함수를 어디에서 호출하는지가 아니라 어디에서 선언하였는지에 따라 함수의 스코프가 결정된다.

  • 위의 코드에서 위 함수의 실행 결과는 과연 어떻게 될까?
    정답은 1이 두번 출력된다. 그 이유는 렉시컬 스코프에 따라서, bar함수는 전역에 선언되었기 때문에 전역 변수 x를 참조하게되어 1을 두번 출력하게 되는 것이다.

출쳐: bsjp400.log

0개의 댓글