> For the complete documentation index, see [llms.txt](https://wlgus3.gitbook.io/jhs-modern-js-deep-dive-note/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wlgus3.gitbook.io/jhs-modern-js-deep-dive-note/14.md).

# 14 전역 변수의 문제점

전역 변수의 무분별한 사용은 위험하다. 전역 변수를 반드시 사용해야 할 이유가 없다면 지역변수를 사용해야 한다.

## 14.1 변수의 생명주기&#x20;

### 14.1.1. 지역 변수의 생명주기

변수는 생물과 유사하게 생성되고 소멸하는 생명주기가 있다. 지역변수는 함수가 호출되면 생성되고 함수가 종료하면 소멸한다. 호이스팅에서 알 수 있듯 JS엔진은 **런타임 이전에 변수를 가장 먼저 선언하고 undefined로 초기화**하는데, 엄밀히 말하면 이는 **전역변수에만 해당**된다. 호이스팅은 스코프 단위로 작동하기 때문이다. **따라서 지역변수의 생명주기는 함수의 생명주기와 일치한다.**

함수 몸체 내부의 지역변수는 함수의 생명주기와 대부분 일치하지만, 해당 함수의 스코프를 누군가가 계속 참조하고 있으면 함수보다 오래 생존할 수도 있다. [24장 클로저](/jhs-modern-js-deep-dive-note/24.md)서 ..

앞서 언급한대로 호이스팅은 스코프 단위로 작동. 따라서 호이스팅은 **변수 선언**이 '**스코프**'의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트의 고유의 특징을 말한다.

### 14.1.2 전역 변수의 생명주기

var 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 된다. 이는 저역 변수의 생명주기가 전역 객체의 생명주기와 일치한다는 것을 의미한다.

{% hint style="info" %}
\[전역객체] ? 코드가 실행되기 이전 단계에서 JS엔진에 의해 가장 먼저 생성되는 특수 객체이다. 클라이언트의 브라우저에서는 window , 서버의 node.js에서는 global 객체를 의미한다. ES11에서 globalThis로 통일되었다.
{% endhint %}

브라우저 환경에서는 전역 객체는 window이므로 var 키워드 변수는 window의 프로퍼티이며, 이는 웹페이지를 닫을 때까지 유효하다.

## 14.2 전역 변수의 문제점&#x20;

#### - 암묵적 결합

전역변수는 모든 코드가 전역 변수를 참조하고 변경할 수 있는 암묵적 결합 implicit coupling을 허용하는 것이다.

#### - 긴 생명주기

전역 변수는 생명 주기가 길기에 의도치 않는 재할당이 이루어질 수 있다.

#### - 스코프체인 상의 종점에 존재&#x20;

전역 변수는 스코프 상의 종점에 존재하기에 검색 속도가 가장 느리다.

#### 네임스페이스 오염

동일한 이름으로 명명된 전역 변수나 전역 함수가 같은 스코프 내에 존재할 경우 예상치 못한 결과를 가져올 수 있다.

## 14.3 전역 변수의 사용을 억제하는 방법

전역 변수를 반드시 사용해야 할 이유를 찾지 못했다면 지역 변수를 사용해야 한다. 변수의 **스코프는 좁을수록 좋다.**

### 14.3.1 즉시 실행 함수

### 14.3.2 네임스페이스 객체&#x20;

### 14.3.3 모듈 패턴

모듈 패턴은 클래스를 모방해서 관련있는 **변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈을 만든다.** 모듈 패턴은 JS의 강력한 기능인 **클로저** 기반으로 동작한다. [24장 클로저](/jhs-modern-js-deep-dive-note/24.md)에서...

**\[캡슐화]**&#xB294; 객체의 **상태**를 나타내는 **프로퍼티**와 프로퍼티를 참조하고 조작할 수 있는 **동작인 메서드**를 하나로 묶는 것을 말한다.

### 14.3.4 ES6 모듈

ES6 모듈을 사용하면 전역함수를 사용할 수 없다. ES6 모듈은 파일 자체의 독자적인 모듈 스코프를 제공한다.
