SCOPE

  • Scope 는 변수가 선언되고 사용할 수 있는 공간을 말함
  • Scope 외부에서는 특정 Scope의 변수에 접근할 수 없음

1. Scope의 종류

1) Local scope

  • 함수 안에서 { } 으로 감싸진 block 안의 범위를 의미
  • Local scope를 가지는 변수는 local variables이라 함
  • 주로 block 이라함은 함수 내부를 의미함
    Ex. function hi() {
    return ‘ i am block’ 
    }
  • hi 뒷 부분 { } 이부분이 block이다
  • 블락 내부에서 변수가 정의되면 변수는 오로지 {} (block) 내부에서만 사용할 수 있음
  • 블락내부에서 선언 된 변수를 {} 블락 밖에서 console.log() 하면, 나오지 않는데, block 이 끝나면 해당변수의 scope도 종료된다. -> 그래서 for문 여러 개 돌릴 때, let i = 0 이렇게 변수 값을 let i 를 주면 for 문 끝났을 때 해당 변수 살아있지않아서 let 쓰면 똑같은 변수명으로 for문 여러 개 가능

2) Global scope

  • block 내 뿐만 아니라 전체적으로 사용가능한 범위를 의미
  • global scope를 가진 변수를 global variable라고 함
  • block밖인 global scope에서 만든 변수를 global variables 라고 함
  • var 가 대표적인 전역변수
  • scope 오염의 위험도가 높아 안쓰는 게 좋음 !
  • Global variables를 쓰면 여기저기서 접근하기 쉬워서 좋다고 생각할 수 도 있지만, 너무 남용하면 프로그램에 문제를 일으킬 수 있음. scope가 프로그램이 종료될 때까지 살아있음

2. Scope오염

  • 전역 변수의 scope가 계속 유효하기 떄문에, 변수로 설정한 값이 다른 값으로 대체되거나 하는 것을 Scope 오염이라 한다.

    * Scope 오염의 대표적 사례

 const satellite = 'The Moon';
 const galaxy = 'The Milky Way';
 let stars = 'North Star';
 const callMyNightSky = () => {
  stars = 'Sirius';
 return 'Night Sky: ' + satellite + ', ' + stars + ', ' + galaxy;
};

console.log(callMyNightSky());
//출력값 : Night Sky: The Moon, Sirius, THe Milky Way
console.log(stars);
//출력값 : Sirius;
  • 함수안에서만 값이 Sirius 로 바뀐 것이 아니라 함수밖에 console을 찍었는데 함수안에서 선언한 'Sirius'가 적용 되어있음. 만약 callMyNightSky 함수에서 , stars 변수 를 여기서만 쓰고 싶었다면 let stars = 'Sirius' 이렇게 정의해줬어야한다 !

3. 좋은 Scoping 습관

  1. 변수들은 block scope로 최대한 나눠준다
    • 최대한 {} 블락 내에서 const 랑 let 많이 쓰기!
  2. Global 변수 남용하지 말기