14.1. 변수의 생명 주기

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

1.지역 변수의 생명 주기

변수는 선언에 의해 생성되고 할당을 통해 값을 갖는다. 그리고 언젠가 소멸한다. 즉, 변수는 생물과 유사하게 생성되고 소멸되는 생명주기(life cycle)을 갖는다.

만약 생명주기가 없다면 프로그램이 종료되지 않는한 영원히 메모리 공간을 점유하게 된다.

전역 변수 선언문은 어디에 있든 상관없이 가장 먼저 실행된다.

반면 지역 변수(함수 내부의 변수)는 함수가 호출되면 다른 문들이 실행되기 이전에 선언문들이 실행되면서(undifined 할당)변수가 생성된다. 그리고 함수가 종료되면 변수도 소멸되어 생명주기가 종료된다.

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

function outer() {
  let x = 10;
  function inner() {
    console.log(x);// outer 함수의 x 변수를 참조
  }
  return inner;
}

let innerFunc = outer();
innerFunc();// 10

하지만 위의 예제는 예외적인 경우다. inner를 리턴하고 함수의 생명주기가 끝나야하지만 렉시컬 환경에 의해 지역변수(x)가 더 오래 생존하는 경우다. →클로저(누군가 스코프를 참조하고 잇으면 스코프는 소멸하지 않고 생종하게 되서이다.)

2.전역 변수의 생명 주기

함수와 달리 전역 코드는 명시적인 호출없이 실행된다. 즉 함수 호출과 같이 전역 코드를 실행하는 진입점이 없고 코드가 로드되자마마 곧바로 해석되고 실행된다.

따라서 전역 변수의 생명 주기는 전역 코드의 마지막 문이 실행되어 더 이상 실행할 문이 없을 때 종료되고 전역 변수도 소멸된다.

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

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

퀴즈