14. 전역변수의 문제점

브리·2022년 6월 13일
0

우선 전역변수와 지역변수의 생명주기를 알아보자.
지역변수는 함수가 호출될 때 생성되고, 함수가 모두 실행되면 소멸한다. 즉 함수의 생명주기와 같다. 물론 지역변수가 함수보다 오래 살아남는 경우가 있기도 하지만.. 이건 클로저에서 자세하게 배울 수 있다고 한다.

반면 전역변수는 코드가 로드되는 순간 생성되었다가 코드에서 더 이상 실행할 코드가 없을 때까지 살아있다.

☄️ 문제점

전역변수가 오래 살아남고, 전역 스코프를 가지고 있으면 머가 문젠뎅?

1. 암묵적 결합

암묵적 결합이라는 용어를 외울 수 있을 지는 모르지만 암묵적 결합이란 코드 내부에서 전역 변수를 어디서든 참조하고 할당할 수 있다는 것이다. 이렇게 되면 당연히 가독성이 떨어지고 사용자 의도와 다르게 값이 변경되는 일이 일어날 수 있다.

2. 긴 생명주기

위에 말했듯이 지역변수와 다르게 전역변수는 아주 긴 생명주기를 가지고 있다. 이렇게 되면 메모리를 쓸데없이 오래 사용하게 된다. 그리고 상태를 변경할 수 있는 시간도, 기회도 당근 많아지게 된다.

  • var 은 더 조심해랏! var은 재선언 재할당이 가능하기 때문에 변수 이름이 중복될 경우 의도치 않은 재선언, 재할당이 언제든 일어날 기회가 더 많다.

3. 스코프 체인에서 종점에 있음

종점이 뭐니 바로바로 마지막 지점이라는 뜻이져
스코프 체인은 가장 내부함수부터 차례대로 밖으로 이동하기 때문에 전역변수는 당연 스코프 체인의 가장 마지막 지점에 위치할 수 밖에 없다. 그렇기 때문에 검색 시간에서 손해를 보게 된다. 아주 큰 차이가 있지는 않지만 차이가 존재하긴 한다.

4. 네임스페이스 오염

이 부분은 생각지도 못했는데 헉스바리.. 자스는 다른 파일로 분리되어있다고 하더라도 하나의 전역 스코프를 공유한다. 그렇기 때문에 다른 파일에서 같은 변수를 재선언하거나 변경하는 일이 일어날 수 있다.

위와 같이 전역 변수를 사용하는 것은 필수적인 때가 아니라면 자제하는 것이 좋다. 변수의 스코프는 웬만하면 작으면 작을수록 좋다!!

하지만 전역 변수를 사용해야만 하는 일이 있을 수도 있다. 이를 해결하기 위한 해결방법이 몇가지 존재하는데

해결방법

1. 즉시실행함수

() 를 사용하여 즉시실행함수를 만들어내면 즉시실행 함수 내부로 스코프가 한정된다. 그렇기 때문에 즉시실행함수의 지역변수가 되고 즉시실행함수가 끝나면 생명주기도 끝나는 것이다.

(function (){ //무명 함수 ㅎㅋ
  var foo=10;
}());
console.log(foo);// 참조 오류!

2. 모듈 패턴 사용

자스는 private, public, protected 와 같은 제한자를 두고 있지 않다.
즉시실행함수를 이용하여 이를 조금이라도 구현해낸것이다. 아래 예제처럼

const Number=(function(){
  // private 변수가 됨
  var num=0;
  return{
    increase(){
      return ++num;
    },
    decrease(){
      return --num;
    }
  }
})
console.log(Number.number);//undefined
console.log(Number.increase());//1
console.log(Number.increase());//2
console.log(Number.decrease());//1
console.log(Number.decrease());//0

3. ES6 모듈

이건 뭔지 잘 모르겠다.. 나중에 알려준다고 함

profile
무럭무럭

0개의 댓글