- 전역 변수는 값이 변경될 위험이 있기 때문에 전역 변수를 반드시 사용해야 할 이유가 없다면 지역 변수를 사용해야 한다.
- 변수는 생성되고 소멸되는 생명 주기가 있다. 생명 주기가 없다면 한번 선언된 변수는 프로그램을 종료하지 않는 한 영원히 메모리 공간을 영원히 점유하게 된다.
function foo () {
var x = local;
console.log(x);
return x;
}
foo();
console.log(x); //ReferenceError x is not defined
📌 변수의 생명 주기는 메모리가 확보된 시점부터 메모리 공간이 해제되어 가용 메모리 풀에 반환되는 시점까지다.
- 따라서 변수는 자신이 등록된 스코프가 소멸될때까지 유효하다. -> 할당된 메모리 공간은 그 누구도 참조하지 않을 때 가비지 콜렉터에 의해 해제되어 가용 메모리 풀에 반환된다.
var x = 'global'; function foo () { console.log(x); //undefined. 함수 내부에서 아직 할당되지 않았기 때문. var x = 'local'; } foo(); console.log(x); //global
- 호이스팅은 스코프를 단위로 동작한다.
- 지역 변수는 함수 내부에서 유효하다.
❓ 전역 객체
- 전역 객체는 코드가 실행되기 이전 단계에 어떤 객체보다도 먼저 생성되는 특수한 객체이다.
변수의 스코프는 좁을수록 좋다.
(function () {
var foo = (); //즉시 실행 함수의 지역 변수
console.log(foo);
❓ 네임 스페이스
- 구분이 가능하도록 정해놓은 범위나 영역
- 전역 객체를 하나 만들고(단 하나만 만드는 것이 이상적이다) 모든 기능을 이 객체에 추가하는 패턴.
- 같은 이름을 가진 변수들의 충돌을 방지하기 위해 이름이 존재하는 공간을 정의하는 기능을 함
var MYAPP = {}; //전역 네임스페이스 객체
MYAPP.name: 'Ssong';
console.log(MYAPP.name); //Ssong
var MYAPP = {};
MYAPP.student = {
name: 'Lee',
gender: 'male'
};
console.log(MYAPP.student.name);
var counter(function () {
//private
var num = 0;
//외부로 공개할 데이터나 메소드를 프로퍼티로 추가한 후 객체를 반환한다.
return {
increase() {
return ++num;
}
decrese() {
return --num;
}
}
}());
console.log(counter.num); //undefined -> private변수는 외부에 노출되지 않는다.
script
태그에 type="module"
어트리뷰트를 추가하면 로드된 자바스크립트 파일은 모듈로서 동작한다. 모듈의 파일 확장자는 mjs를 권장한다.<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>
<모던 자바스크립트 deepdive와, 추가 탐구한 내용을 정리한 포스트입니다.>