모던 JS 딥다이브 공부용 글입니다.
전역 변수의 무분별한 사용은 위험하다.
전역 변수를 반드시 사용해야 할 이유가 없다면 지역변수를 사용해야 한다.
- 변수의 생명 주기 : 메모리 공간 확보 ~ 메모리 공간 해제 후 가용 메모리 풀에 반환되는 시점까지
- 전역 변수의 생명 주기 === 어플리케이션의 생명 주기
- 함수 내부의 지역 변수 === 함수호출~함수종료
즉 변수는 자신이 등록된 스코프가 소멸될 때까지 유효한데, 스코프는 누군가가 자신을 참조하고 있으면 메모리에 확보된 채로 남아 있는다.(24장 클로저에서 상세)
함수와 달리 전역코드는 전역코드를 실행하는 특별한 진입점이 없고 코드가 로드되자마자 곧바로 해석되고 실행된다.
var 키워드 변수는 전역 객체의 프로퍼티가 된다. 이는 전역 객체와 생명주기가 일치함을 의미.
(전역 객체는 코드 실행 전 JS 엔진에 의해 최우선으로 생성되는 특수 객체)
브라우저 환경에서 전역 객체는 window. var 키워드는 window 객체의 프로퍼티
암묵적 결합
모든 코드가 전역 변수를 참조하고 변경 가능한 암묵적 결합을 허용
변수의 유효 범위가 크면 클수록 코드의 가독성이 나빠지고 의도치 않게 상태가 변경될 위험도 증가
긴 생명 주기
전역 변수는 생명 주기가 길다.
스코프 체인 상 종점에 존재
전역 변수가 가장 마지막에 검색되므로 전역 변수의 검색 속도가 가장 느리다.
네임스페이스 오염
파일이 분리되어도 하나의 전역 스코프를 공유.
전역 변수를 사용할 이유가 없다면 지역 변수를 사용해라( 변수의 스코프는 좁을수록 좋다.)
모든 코드를 즉시 실행 함수로 감싸면 변수는 즉시 실행 함수의 지역 변수가 된다.
(function(){
var foo = 10; // 즉시 실행 함수의 지역 변수
// ...
}());
캡슐화
캡슐화는 객체의 상태를 나타내는 프로퍼티와 메서드를 하나로 묶는 것.
캡슐화는 객체의 특정 프로퍼티나 메서드를 감출 목적으로 사용하기도(정보 은닉)
다른 언어들은 클래스에서 public, private, protected 등의 접근 제한자를 사용해 공개 범위 한정 가능
Public은 외부 접근 가능
private는 외부 접근 불가. 내부에서만 사용됨.
JS는 제공 X but 모듈패턴으로 제한적 구현 가능
var Counter = (function(){ //private 변수 var num = 0; // 외부로 공개할 데이터나 메서드를 프로퍼티로 추가한 객체를 반환 return { increase(){ return ++num; }, decrease(){ return --num; } } }()); console.log(Counter.num) // undefined console.log(Counter.increase()) // 1 console.log(Counter.increase()) // 2 console.log(Counter.decrease()) // 1 console.log(Counter.decrease()) // 0
- 사용법
script 태그에 type="module" 추가. 확장자 mjs- 구형 브라우저 지원 X 걍 Webpack 등의 모듈 번들러 사용이 일반적