전역 변수의 무분별한 사용은 위험하다.
특별한 이유가 없다면 무조건 적으로 지역변수를 사용하자
변수는 선언을 통해 생성되고, 할당을 통해 값을 받는다. 그리고 사용할 일이 없어지면 소멸된다.
(만약 소멸 되지 않는다면 메모리 공간에 영원히 남는 문제가 생긴다.)
전역변수는 런타임 이전 단계에서 자바스크립트 엔진에 의해 선언이 실행된다.
지역변수는 함수가 호출되어 실행되는 동안에만 유효하다.
-> 지역변수의 생명주기는 함수의 생명주기와 일치한다.
var 키워드로 선언한 전역 변수의 생명 주기는 window와 같은 전역객체의 생명 주기와 일치한다.
let, const로 선언된 전역 변수는 전역객체의 속성으로 등록되지 않고, 스크립트 자체의 범위에 종속된다.
모든 코드가 전역 변수를 참조하고 변경할 수 있는 암묵적 결합을 허용하기에, 의도치 않게 상태가 변경될 수 있는 위험도가 높아진다.
전역 변수는 생명 주기가 길다.
스코프 체인 상에서 종점에 존재
전역변수는 스코프 체인 상에서 종점에 존재하기 때문에 전역변수가 가장 마지막에 검색되기 때문에 전역 변수의 검색속도가 가장 느리다.
네임스페이스 오염
자바스크립트는 파일이 분리되어 있다 해도 하나의 전역 스코프르 공유한다. 다른 파일에서 동일한 이름으로 명명된 전역 변수, 전역 함수가 같은 스코프 내에 존재 할 경우 사이드 이펙트 발생!
즉시 실행 함수
함수 정의와 동시에 호출되는 즉시 실행 함수는 단 한 번만 호출되어, 즉시 실행 함수 내의 모든 변수는 즉시 실행 함수의 지역 변수가 된다.
네임스페이스 객체
전역에 네임스페이스 역할을 담당할 객체를 생성하고, 전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가하는 방법~~
-> 객체 자체가 전역 변수에 할당되므로 유용하진 않음
모듈 패턴
자바스크립트는 접근 제한자를 제공하지 않는다.
모듈 패턴을 사용하여 외부에 노출하고 싶은 변수나 함수를 return을 통해 반환한다.
ES6
ES6모듈은 독자적인 모듈 스코프를 제공한다.
모듈 내에서 var로 서언한 변수는 더 이상 전역 변수가 아니다.