1. 스코프란❓

JS 엔진이 식별자를 검색할 때 사용하는 규칙

스코프란 식별자가 유효한 범위를 이야기하며,
모든 식별자 들은 자기 자신이 선언된 위치에 의해서
다른 코드가 자기 자신을 참조할 수 있는 유효 범위가 결정되기 때문.

스코프는 네임스페이스로 식별자의 변수명 충돌을 방지하므로, JS엔진에서 이 스코프를 통해 어떤 변수를 참조해야 할 것인지 결정하고 사용할 수 있게 한다.


✨ 추가설명

var 키워드로 같은 스코프 내에서의 중복 선언은 허용되나, let이나 const와 같은 키워드로 선언된 변수는 중복선언을 허용하지 않는다!

특징

  • JS 엔진은 스코프를 통해 어떤 변수를 참조해야 할 것인지 결정.
  • 따라서 JS 엔진이 식별자를 검색할 때 사용하는 규칙 이라고도 할 수 있음.


2. 스코프의 종류

코드는 전역, 그리고 지역 으로 구분되며, 이 때 식별자, 즉 변수는 본인이 선언된 위치에 의해서 스코프가 결정된다.

전역

코드의 가장 바깥 영역으로,
전역에 변수 선언 시 전역 스코프를 갖는 전역변수가 만들어진다.
이 전역 변수는 어디서든지 참조가 가능하다.

지역

함수의 내부를 이야기하며,
지역에 변수 선언 시 지역 스코프를 갖는 지역변수가 만들어진다.
이 지역 변수는 선언된 지역 및 하위지역에서 유효하다.



3. 스코프체인

3-1. 스코프 체인이란❓

모든 스코프가 함수의 중첩에 의해서 계층적 구조를 가지는 것을 이야기함.

특징

  • 변수 참조시, JS 엔진은 스코프 체인을 사용.
  • 변수를 참초하는 코드의 스코프에서 시작하여 상위 스코프로 이동.
  • 선언된 변수를 검색하며 변수를 찾음.
  • 이러한 방법으로 상위 스코프에서 선언한 변수를 하위 스코프에서 참조가 가능.

3-2. 스코프 체인에 의한 변수 검색

상위 스코프에서 유효한 변수하위 스코프에서 자유롭게 참조할 수 있음.
허나, 하위 스코프에서 유효한 변수상위 스코프에서 참조할 수는 없음.

이는 스코프 체인이 실행 컨텍스트의 렉시컬 환경을 단방향으로 연결한 것이기 때문이며, 스코프의 계층적 구조는 상속의 개념과 유사하다는 특징이 있다.



4. 함수 레벨 스코프란❓

코드 블록이 아닌, 함수에 의해서만 지역 스코프가 생성된다는 의미.

대부분의 프로그래밍 언어는 함수를 포함한 중괄호{} 즉, 코드블록이 지역 스코프를 만들며, 이러한 특성을 블록 레벨 스코프 라고 함.

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

var x = 1;
// 

if (true) {
  // 함수 밖에서 선언된 var 키워드 변수는 코드 블록 안이라도 모두 전역변수.
  // 따라서 x는 전역변수.
  // 이는 의도치 않게 변수값이 변경되는 부작용을 야기시킴.
 var x = 10; 
}
console.log(x); // 10

하지만, 이후 ES6에서 도입된 let, const 키워드는 블록 레벨 스코프를 지원하여 의도치 않게 변수값이 변경되는 문제나, 지역변수를 함수 외의 코드블럭에서 사용해야하는 문제를 해결하게 됨.



5. 렉시컬 스코프란❓

다른 말로, 정적 스코프(Static scope)라 부르기도 한다.

함수를 어디서 호출하는지가 아니라,
어디에 선언하였는지에 따라 결정되는 것을 말한다.

JS는 이 렉시컬 스코프를 따르는 프로그래밍 언어로, 함수가 호출 된 위치는 상위 스코프 결정에 어떠한 영샹도 주지 않으며, 함수의 상위 스코프는 언제나 자신이 정의된 스코프이다.

즉, 함수를 어디서 선언하였는지에 따라 상위 스코프를 결정한다는 뜻이며,
가장 중요한 점은 함수의 호출이 아니라 함수의 선언에 따라 결정된다는 점이다.



profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글

Powered by GraphCDN, the GraphQL CDN