14장 전역변수의 문제점
14.1 변수의 생명주기
변수는 선언에 의해 생성되고, 할당을 통해 값을 가짐. => 생명주기가 있음 (life cycle)
Q. 만약 변수에 생명주기가 없다면?
한번 선언된 변수가 프로그램이 끝날 때까찌 영원히 메모리 공간을 점유함-> 와.. 컴퓨터 터질듯
지역변수
지역변수는 함수가 호출되면 생성되고, 함수가 종료되면 소멸함.
= 지역변수의 생명주기는 함수의 생명주기와 일치
Q. 지역 변수가 함수보다 오래 생존하는 경우?
변수의 생명주기 : 메모리 공간이 확보된 시점 ~ 메모리 공간이 해제되어 가용 메모리 풀에 반환 되는 시점
but, 만약 누군가 스코프를 참조하고 있으면 스코프는 소멸하지 않고 생존함
호이스팅은 스코프 단위로 동작함.
지역변수의 호이스팅은 지역 변수의 선언이 지역 스코프의 선두로 끌어 올려진 것처럼 동작함.
전역변수
전역코드는 코드가 로드되지마자 곧바로 해석되고 실행되고, 더이상 실행될 문이 없을 때 종료함
var키워드로 선언한 전역 변수는 전역객체의 프로퍼티가 됨.
브라우저 환경에서 전역객체는 window이고, 전역객체 window는 웹페이지를 닫기 전까지 유효함.
-> 전역 변수의 생명주기는 전역객체의 생명주기와 일치
14.2 전역변수의 문제점
- 암묵적 결합 : 모든 코드가 전역변수를 참조, 변경가능 -> 가독성 나빠짐, 상태 변경의 위험이 큼
- 긴 생명주기 : 생명주기가 길어서, 메모리 리소스를 오랜기간 소비함, 상태 변경 가능 시간이 길고, 기회가 많음. -> 의도하지 않은 코드 생성가능
- 스코프 체인 상에서 종점에 존재 : 전역 변수를 검색할 때 가장 마지막에 검색 -> 검색속도가 제일 느림
- 네임 스페이스 오염 : 파일이 분리되어있어도 스코프를 공유하기 때문에 동일한 이름으로 명명된 다른 식별자가 있을 경우 예상치 못한 문제 발생가능
14.3 전역 변수의 사용을 억제하는 방법
전역변수 사용을 가급적 금지하고, 변수의 스코프가 좁은 지역변수 사용을 권장.
1. 즉시실행함수
2. 네임스페이스 객체
3. 모듈패턴
4. ES6 모듈
15장 let, const 키워드와 블록레벨 스코프
15.1 var 키워드로 선언한 변수의 문제점
- 변수 중복 선언 허용
- 함수레벨 스코프
- 변수 호이스팅
15.2. let 키워드
- 변수 중복 선언 금지
같은 이름의 변수를 선언시 문법 에러 (Syntax Error)발생
- 블록 레벨 스코프
모든 코드 블록을 지역 스코프로 인정하는 블록레벨 스코프를 따름
-> Q.이건 지역 스코프라는데..?
- 변수 호이스팅
변수 호이스팅이 발생하지 않는 것처럼 동작함-> 일시적 사각지대 (Temporal Dead Zone)발생가능.
변수 선언 시점에 초기화 발생 -> 선언 단계 / 초기화 단계 가 분리되어 진행되기 때문 ->
스코프 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간 발생 => ReferenceError
- 전역객체와 let
let은 전역객체의 프로퍼티가 아님 -> 개념적인 블록 내에 존재하게 됨
전역으로 선언해도 블록이 따로 만들어지고, 전역객체의 프로퍼티에 속하지 않게됨!
15.3 const 키워드
- 선언과 초기화
선언과 초기화를 동시에 진행해야함. 아닐경우 -> Syntax Error발생
- 재할당 금지
당연함. 상수변수니까
- 상수
원시값을 할당한 경우 변수값을 변경할 수 없음.
보통 상수를 의미하는 변수의 경우 대문자 + snake_case로 표기
ex ) const TAX_RATE = 0.1;
- const 키워드와 객체
객체를 할당한 경우 값을 변경할 수 있음.
15.4 "var" vs "let" vs "const"
ES6을 사용한다면, 변수 선언시 기본적으로 const를 사용, 재할당이 필요한 경우 let을 한정적으로 사용한다.
let사용시 변수의 스코프는 최대한 좁게 사용하기