: 식별자가 유효한 범위
var
변수는 같은 스코프 내에서 중복 선언이 허용됨 <- 의도치 않은 변수 재할당 발생: 스코프가 계층적으로 연결된 것
var
키워드로 선언된 변수// case1
function foo() {
var abc = 123;
if(true) {
var abc = 456;
}
console.log(abc); // 456
}
foo();
//case2
function foo() {
var abc = 123;
function bar() { // (abc = 123과는 다른 새로운 스코프)
var abc = 456;
}
console.log(abc); // 123
}
foo();
let
, const
키워드로 선언된 변수ReferenceError
발생var
와 달리, 동일한 변수명에 대한 선언은 한 블록 내에서 한 번만 가능function foo() {
console.log(bar); // undefined (호이스팅을 지원하지 않는 언어에서는 에러를 일으킬 것)
var bar = 123;
}
// 위코드는 아래와 같이 동작한다.
function foo() {
var bar;
console.log(bar);
bar = 123;
}
(function () {
var foo = 10; // 즉시 실행 함수의 지역 변수
//...
}());
var MYAPP = {}; // 전역 네임스페이스 객체
MYAPP.name = 'Lee';
console.log(MYAPP.name); // Lee
var Counter = (function () {
// private 변수 기능
var num = 0;
// 외부로 공개할 메서드 반환
return {
increase() {
return ++num;
},
decrease() {
return --num;
}
};
}());
console.log(Counter.num); // undefined
console.log(Counter.increase()); // 1
캡슐화
객체의 프로퍼티와 메서드를 하나로 묶는 것
정보 은닉의 목적으로 사용하기도 함
var
키워드로 선언한 변수는 더 이상 전역 변수가 아니며 window 객체의 프로퍼티도 아니게 된다.type="module"
어트리뷰트 추가 시, JS 파일은 모듈로서 동작mjs
권장<script type="moudle" src"lib.mjs"></script>