전역변수의 무분별한 사용은 지양하는 것이 좋다. 🙅♀️
변수에게도 생명주기가 존재한다. 변수도 생성되고 소멸되는 생명 주기가 있다.
let a = "global";
function foo() {
let x = "local";
console.log(x);
return x;
}
foo();
console.log(a); // "global"
console.log(x); // ReferenceError: x is not defined
👉 하기 예제로 전역 변수와 내부에 선언된 지역 변수의 차이를 확인 할 수 있다.
함수가 종료되고 지역변수 x
또한 사라져, 더 이상 존재하지 않는다.
var x = "global";
function foo() {
console.log(x); // undefined
var x = "local";
}
foo(); // undefined
console.log(x); // "global"
👉 함수 foo() 를 실행하니, 전역 변수 x
가 아닌 지역 변수 x
를 참조해 undefined
를 출력한다.
📄 호이스팅: 변수나 함수의 선언부가 스코프의 최상단으로 끌어올려지는 현상을 말한다.
전역 변수는 프로그램 종료 시까지 계속해서 참조가 가능하다.
다만, 브라우저 환경에서는 전역 공간이window
객체이기 때문에 브라우저 환경에서는window
의 생명주기와 일치한다고 말해야 옳다.
전역 변수를 반드시 사용해야 할 이유를 찾지 못한다면 지역 변수를 사용해야한다. 변수 스코프는 좁을수록 좋다!
모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 된다.
(function () {
let foo = 10;
})();
console.log(foo); // ReferenceError: foo is not defined
네임 스페이스 역활을 담당할 객체 생성 후 전역 변수 처럼 사용하고 싶은 변수를 프로퍼티로 추가 하는 방법
var MYAPP = {}; // 전역 네임스페이스 객체
MYAPP.name = "LEE";
console.log(MYAPP.name); // "LEE"
👉 하지만, 결국 네임스페이스 객체가 전역 공간에서 선언되기때문에 유용하지는 않음
클래스를 모방해서 관련 있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈료 만든다.
var Counter = function () {
// private 변수
var num = 0;
return {
increase() {
return ++num;
},
decrease() {
return --num;
},
};
};
파일 자체의 독자적인 모듈 스코프를 제공한다.
<script type="module" src="lib.jsx"></script>
👉 파일을 import 해 쓰면 사용이 가능하다 하지만 babel 이나 webpack 같은 모듈 번들러를 사용하는 것이 일반적이다.