[모던자바스크립트] 14. 전역 변수의 문제점

이아현·2023년 8월 7일
0
post-thumbnail

✅ 1. 변수의 생명 주기

✔️ 지역 변수의 생명주기

  • 함수 내부에서 선언된 지역 변수는 함수가 호출되면 생성되고 함수가 종료하면 소멸

  • 변수 선언은 코드가 한 줄씩 순차적으로 실행되는 시점인 런타임에 실행되는 것이 아니라 런타임 이전 단계에서 자바스크립트 엔진에 의해 먼저 실행 => 전역변수 한정

  • 지역 변수의 생명주기는 함수의 생명 주기와 일치

  • 호이스팅은 스코프 단위로 동작하기 때문에 함수 내부의 지역변수에서도 호이스팅이 동작!

    var x = 'global';
    
    function foo() {
    	console.log(x); // undefined (foo함수 내부의 지역변수 x는 이미 undefined 값으로 선언이 되었기 때문)
      var x = 'local'
    };
    
    foo(); 
    console.log(x); // global

✔️ 전역 변수의 생명주기

  • 전역 코드에는 반환문을 사용할 수 없기 때문에 마지막 문이 실행되어 더 이상 실행할 문이 없을 때 종료
  • var키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 됨
    • 전역 객체 : 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체
    • 클라이언트 사이드 환경(브라우저)에서는 window, 서버 사이트 환경에서는 global 객체를 의미
  • 그렇기 때문에 var 키워드로 선언한 전역 변수의 생명 주기는 전역 객체의 생명 주기와 일치

✅ 2. 전역 변수의 문제점

  1. 암묵적 결합
    • 암묵적 결합 : 모든 코드가 전역 변수를 참조하고 변경할 수 있게 하는 것
    • 변수의 유효 범위가 크면 코드의 가독성은 나빠지고, 의도치 않게 상태가 변경될 수 있는 위험성도 높아짐
  2. 긴 생명 주기
    • 전역 변수는 생명 주기가 길다.
    • 지역 변수는 전역 변수보다 상태 변경에 의해 오류가 발생할 확률이 낮고, 메모리 리소스도 짧은 기간만 소비
  3. 스코프 체인 상에서 종점에 존재
    • 전역 변수의 검색 속도가 가장 느림
  4. 네임스페이스 오염
    • 다른 파일 내에서 동일한 이름으로 명명된 전역 변수가 함수가 같은 스코프 내에 존재할 경우 예상치 못한 결과가 나올 수 있음

✅ 3. 전역 변수의 사용을 억제하는 방법

  1. 즉시 실행 함수
    • 모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 됨
  2. 네임스페이스 객체
    • 전역에 네임스페이스 역할을 담당할 객체를 생성, 전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가
    • 네임스페이스를 계층적으로 구성할 수 있음
  3. 모듈 패턴
    • 클래스를 모방해서 관련이 있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈을 만들고, 캡슐화까지 구현이 가능하며 정보은닉을 위해서도 사용
    • 반환되는 객체의 프로퍼티 : 외부에 노출되는 퍼블릭 멤버
    • 반환되지 않는 객체의 프로퍼티 : 프라이빗 멤버
  4. ES6 모듈
    • 파일 자체의 독자적인 모듈 스코프를 제공
    • 모듈 내에서 var 키워드로 선언한 변수는 더는 전역 변수가 아니며 window객체의 프로퍼티도 아님
profile
PM을 지향하는 FE 개발자 이아현입니다 :)

0개의 댓글