코밍이의 하루

[Deep Dive Study] 14장 전역 변수의 문제점 본문

웹언어 공부/JS

[Deep Dive Study] 14장 전역 변수의 문제점

코밍이 2023. 3. 11. 03:20

14.1 변수의 생명 주기

1. 지역 변수의 생명 주기는 함수의 생명 주기와 일치한다.

// 예제1
function foo() {
	var x = 'local';
	console.log(x); // local
	return x;
}

foo();
console.log(x); // 참조 오류

// 예제2
var x = 'global';

function foo() {
	console.log(x); // undefined
	var x = 'local';
}

foo();
console.log(x); // global

1) 호이스팅은 스코프를 단위로 동작한다.

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

 

2. var 키워드로 선언한 전역 변수의 생명 주기는 전역 객체의 생명 주기와 일치한다.

 

14.2 전역 변수의 문제점

1. 암묵적 결합 : 모든 코드가 전역 변수를 참조하고 변경할 수 있다.

1) 변수의 유효 범위가 클수록 가독성은 나빠지고 의도치 않게 상태가 변할 수 있다.

 

2. 긴 생명 주기: 전역 변수는 생명주기가 길다.

1) 메모리 리소스도 오래 소비하고 전역 변수 상태를 변경할 수 있는 시간도 길다.

 

3. 스코프 체인 상에서 종점에 존재

1) 변수 검색 시 전역 변수가 가장 마지막에 검색된다.

- 검색 속도가 가장 느림.

 

4. 네임스페이스 오염

1) 파일이 분리되어 있어도 하나의 전역 스코프를 공유한다.

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

* 지역 변수를 사용한다.

- 변수의 스코프는 좁을수록 좋다.

 

1. 즉시 실행 함수 : 단 한번만 호출

- 모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 된다.

- 라이브러리에 자주 사용한다.

(function () {
	var foo = 10; // 즉시 실행 함수의 지역 변수
}());

console.log(foo); // 참조 오류

2. 네임스페이스 객체

- 전역에 네임스페이스 역할을 담당할 객체를 생성하고 전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가하는 방법이다.

var MYAPP = {}; // 전역 네임스페이스 객체

MYAPP.name = 'Pro';

console.log(MYAPP.name); // Pro

- 네임스페이스 객체에 다른 네임스페이스 객체를 프로퍼티로 추가해서 네임스페이스를 계층적으로 구성할 수 있다.

var MYAPP = {}; // 전역 네임스페이스 객체

MYAPP.person = {
	name: 'Pro',
	address: 'Seoul'
};

console.log(MYAPP.person.name); // Pro

 

3. 모듈 패턴 : 클래스를 모방해서 관련있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈을 만든다.

1) 클로저 기반 동작, 전역 변수의 억제, 캡슐화 구현

*캡슐화 : 객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참조하고 조작할 수 있는 동작인 메서드를 하나로 묶는 것

- (정보 은닉)

 

4. ES6 모듈 : 파일 자체의 독자적인 모듈 스코프를 제공

<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>

 

Review

- 13장 스코프와 연관이 있고 전역 변수에 대해 더 자세히 설명해주는 구간이다. 전역 변수 자체의 내용은 이해가 되었지만 네임스페이스 라든지 모듈 패턴 같은 경우는 암기식으로 넘어가게 된 것 같다.

 

출처 : https://wikibook.co.kr/mjs/

 

모던 자바스크립트 Deep Dive: 자바스크립트의 기본 개념과 동작 원리

269개의 그림과 원리를 파헤치는 설명으로 ‘자바스크립트의 기본 개념과 동작 원리’를 이해하자! 웹페이지의 단순한 보조 기능을 처리하기 위한 제한적인 용도로 태어난 자바스크립트는 과도

wikibook.co.kr