Chapter 14
14.1 변수의 생명주기
14.1.1 지역 변수의 생명 주기
- 변수는 자신이 선언된 위치에서 생성되고 소멸한다. 변수 선언은 선언문이 어디에 있든 상관없이 가장 먼저 실행된다. 즉, 런타임 이전 단계에서 자바스크립트 엔진에 의해 먼저 실행된다. 하지만, 이는 전역 변수에 한정된 설명이다.
함수 내부에서 선언된 지역 변수는 그 변수가 선언된 함수가 호출되어 실행되는 동안만 유효하다. 즉, 지역 변수의 생명 주기는 함수의 생명 주기와 일치한다.
지역변수가 함수보다 오래 생존하는 경우?
- 변수의 생명 주기는 메모리 공간이 확보된 시점부터 해제되어 가용 메모리 풀에 반환되는 시점까지다. 이는 스코프에도 적용된다. 누군가 스코프를 참조하고 있으면 스코프는 소멸하지 않는다. 이를 활용해 클로저를 사용할 수 있다.
클로저?
클로저 함수는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 스코프 밖에서 호출되어도 그 스코프에 접근할 수 있는 함수를 말한다.
- 자신을 포함하고 있는 외부함수보다 내부함수가 더 오래 유지되는 경우, 내부함수가 외부 함수의 렉시컬 환경을 상위 스코프로 저장하고 있으므로 외부 함수의 렉시컬 환경에 대한 참조가 끊어지지 않기 때문에 외부 함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근할 수 있다.
- 클로저는 상태가 의도치 않게 변경되지 않도록 상태를 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하여 상태를 안전하게 변경하고 유지하기 위해 사용한다.
호이스팅?
호이스팅이란 코드 블록에 선언된 변수선언 및 함수선언을 코드 블록의 최상단으로 끌어 올리는 것을 말하며 실제로 끌어올려지지않지만 옮긴 것처럼 동작하는 특성이다.
- 호이스팅의 종류에는 var,let,const 호이스팅, 함수 선언식, 함수 표현식의 호이스팅이 있다. 호이스팅이 된다 하더라도 각각 차이점이 존재한다.
14.1.2 전역 변수의 생명 주기
var 키워드로 선언한 전역 변수의 생명 주기는 전역 객체의 생명 주기와 일치한다. 전역 객체 window는 웹페이지를 닫기 전까지 유효하므로 var로 선언한 변수의 생명주기는 웹페이지를 닫을 때까지 유효하고, 전역 객체의 생명 주기와 일치한다.
14.2 전역 변수의 문제점
암묵적 결합
- 모든 코드가 전역 변수를 참조하고 변경할 수 있는 현상이다. 변수의 유효 범위가 커서 가독성이 나빠지고, 의도치 않은 상태 변경이 생길 수 있다.
긴 생명 주기
- 메모리 리소스가 오랜 기간 소비된다. 전역 변수의 상태를 변경할 수 있는 시간도 길고 기회도 많다.
스코프 체인 상에서 종점이 존재
- 변수를 검색할 때 마다 전역 변구가 가장 마지막에 검색되기 때문에 검색 속도가 가장 느리다.
네임스페이스 오염
- 다른 파일 내에서 동일한 이름으로 명명된 전역 변수나 함수가 같은 스코프 내에 존재할 경우 예상치 못한 결과를 초해할 수 있다.
14.3 전역 변수의 사용을 억제하는 방법
반드시 사용할 필요가 없다면 스코프를 좁게 설정한다.
14.3.1 즉시 실행 함수
- 모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 된다.
14.3.2 네임스페이스 객체
- 전역에 네임스페이스 역할을 담당할 객체를 생성하고 전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가한다.
var ME = {};
ME.person = {
name:"jin',
age:26,
}
14.3.3 모듈 패턴
- 모듈 패턴은 클래스를 모방해서 관련이 있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈을 만든다. 모듈 패턴은 자바스크립트의 강력한 기능인 클로저를 기반으로 동작한다. 클로저로 캡슐화를 활용해 정보를 은닉할 수 있다.
14.3.4 ES6 모듈
- ES6 모듈을 사용하면 전역변수를 사용할 수 없다. ES6 모듈은 파일 자체의 독자적인 모듈 스코프를 제공한다.