
전역변수의 무분별한 사용은 지양하는 것이 좋다. 🙅♀️
변수에게도 생명주기가 존재한다. 변수도 생성되고 소멸되는 생명 주기가 있다.
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 같은 모듈 번들러를 사용하는 것이 일반적이다.