오늘 Scope를 공부 하다가 새로 알게된 부분이 있었다.
scope의 오염에 관련된 부분인데 개념을 확실하게 잡고 가는게 좋다고 생각했다.
전역 변수(global Variable)는 해당프로그램의 어디에서나 사용할 수 있는 global namespace를 갖는다.
namespace라는 것은 변수 이름을 사용할 수 있는 범위라는 뜻이다. scope이라고도 하고 특히 변수이름을 얘기할 때는 namespace라고도 한다.
전역변수를 선언하면 global namespace도 갖게 되는데 그로인해 접근성이 좋다는 생각이 들어 남용하기 쉽다. 하지만 그렇게되면 문제를 일으키기 쉽다.
그래서!
전역 변수(global Variable) 에는 주의해야 한다.
변수를 명시적으로 전역 스코프에서 선언하지 않더라도, 한 번도 선언되지 않은 이름으로 안쪽 스코프에서 let, const, var를 붙여주지 않고 변수를 선언하면 전역 변수가 되어버린다.
function func() {
variable = 1;
// `variable`이라는 변수가 선언된 적 없으므로, 전역 변수가 된다.
}
func();
console.log(variable); //1
/*scope 내부 변수에는 접근할 수 없어야 하는데 variable가
전역 변수가 되어 버려서 접근 가능*/
또, 전역 변수는 코드의 어떤 부분에서든 아무런 제한 없이 접근하고 조작할 수 있다.
let stars = 'North Star';
const callMyNightSky = () => {
stars = 'Sirius'; // stars 변수의 값을 바꿔 버림
return 'Night Sky: ' + stars;
};
console.log(callMyNightSky()); // Night Sky: Sirius
console.log(stars); // Sirius
callMyNightSky 함수 내에서 새로운 stars 변수를 선언하길 원했는데 let 키워드를 작성하지 않았다.
그래서 callMyNightSky을 호출하면 stars 변수에 "Sirius" 가 할당되고 전역변수 자체가 수정이 되었다. 이것을 스코프의 오염이라고 한다.
그리고 이로인해 잘못 바뀐 전역변수는 프로그램이 종료될때까지 계속 살아있게 된다.
🔥전역변수는 지역변수와 다르게 프로그램이 종료될때까지 계속 살아있기 때문에 변수값이 계속 변한다면 해당 변수의 변화를 예측,감시하기도 어렵고
이 변수는 어디에서 왜 필요한지 알려면 도대체 어디에서 let, const로 선언을 했는지 찾기 힘들다. 그로인해 가독성도 떨어지는 상황이 생긴다.