모던 자바스크립트 딥다이브 스터디 #3-2 (CH14, 15)

14장 전역 변수의 문제점

JS에서는 전역변수를 반드시 사용해야 할 이유가 없다면 사용을 최대한 억제하라고 한다.

사실 이건 JS뿐만 아니라 대부분 프로그래밍 언어에 해당된다. PS할때만 편하니까 쓰는 것 뿐…

변수의 생명 주기

생명주기는 기본적으로 실행컨텍스트의 스택프레임으로 이해하면 된다.

다만 JS에서 var 키워드 변수는 함수 스코프, 그 외에는 전역 변수라는것을 기억하자. 따라서 var 전역 변수는 전역 객체의 프로퍼티가 되어 애플리케이션 종료까지 함께 남아있는다.

하지만 더 엄밀히 하면… 변수의 스코프는 스택프레임과 일치하지만.. 사실 변수의 값은 메모리에 남아있다. 메모리 자체에서 해제하는건 GC의 역할이다. 어디 하나라도 해당 변수의 주소를 참조하고 있다면, 즉 참조카운팅이 0이 아니라면 값은 메모리에 남아있다.

그래서 일반적으로는 함수가 종료되면 함수가 생성한 컨텍스트도 소멸하지만, 누군가가 컨텍스트를 참조 하고 있다면 해당 컨텍스트도 해제되지 않고 생존하게 된다. (invisible해서 접근할순 없겠지만…) 이는 이후 클로저 개념으로 이어진다.

호이스팅은 스코프 단위로 동작한다. 따라서 호이스팅을 다시 더 엄밀하게 설명하자면, 변수 선언시 해당 스코프의 선두로 끌어올려진 것처럼 동작하는 것이다.

💡 전역객체

전역 객체는 코드가 실행되기 이전 단계에 JS엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체를 말한다. 전역 객체는 클라이언트 사이드 환경에서는 window, node.js환경에서는 global객체를 말한다. 환경에 따라 이 전역객체를 가리키는 다양한 식별자가 있었지만, ES11부터 globalThis로 통일되었다.

전역 변수의 문제점

  1. 암묵적 결합