scope(유효범위)

장돌뱅이 ·2022년 1월 5일
0

JavaScript

목록 보기
13/46

scope(범위)
변수의 유효한 범위를 말한다. (= 변수가 선언되는 문맥)

1. global scope

전역범위에서 변수는 블록 외부에서 선언된다.(global variable, 전역변수) 블록 내부에 바인딩되어 있지 않기 때문에 블록 내 코드를 포함하여 프로그램의 모든 코드로 접근될 수 있다.

2. block scope

변수가 블록 {} 안에서 선언되면 이 변수는 블록 내에서만 유효하게 된다. 이렇게 블록 내에서만 사용될 수 있는 변수를 local variable(지역변수)라고 한다.

const logSkyColor = () => {
  let color = 'blue'; 
  console.log(color); // blue 
};
 
logSkyColor(); // blue 
console.log(color); // ReferenceError

3. Scope Pollution (스코프 오염)

전역변수를 너무 많이 선언할 경우 또는 다른 스코프 안의 변수를 재사용하는 경우 생긴다.
다른변수를 추적하는 것이 어려워지고, 지역변수와 충돌하는 등 문제를 일으킬 위험이 있다.

let num = 50;
 
const logNum = () => {
  num = 100; // Take note of this line of code
  console.log(num);
};
 
logNum(); // Prints 100
console.log(num); // Prints 100

4. 그래서 가능한 한 전역범위보다 블록범위를 사용하는 게 낫다.

블록 내에 변수를 선언하게 되면 코드가 읽기 쉬워지고, 블록 내에서 변수가 분명하게 정의되어 코드를 이해하기 쉬워지기 때문이다. 또한 코드를 유지하기 쉬워지고 메모리를 절약한다.(블록 작동이 끝나면 코드가 중단되므로)

5. 정적유효범위

  • 자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖는다. 이런 유효범위의 방식을 정적유효범위(static scoping) 혹은 렉시컬(lexical scoping)이라고 한다.
let i = 5;

function a() {
  let i = 10;
  b();
}

function b() {
  console.log(i);
}

a();

// 5 

함수b가 실행될 때 함수 안에 i라는 전역변수가 있는지 먼저 찾게된다. b가 실행된 시점에(사용될 때) 변수 i가 사용되는 것이 아니라, b가 정의될 때의 변수, 즉 전역변수가 사용된다. => 정적유효범위(lexical scoping)라고 한다.
함수b가 사용되는 대상에 따라서 그 대상이 갖고 있는 변수에 접근한다면 그것은 동적 유효범위가 된다.

0개의 댓글

관련 채용 정보