전역 변수의 생명 주기는 애플리케이션의 생명 주기와 같다.

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

<aside> 💡 전역 변수 생명주기 == 애플리케이션의 생명 주기 지역 변수 생명주기 == 함수의 생명 주기 변수의 호이스팅은 스코프 단위로 동작한다.

</aside>

함수 스코프와 블록 스코프의 차이

<aside> 💡 스코프 : 변수에 접근할 수 있는 범위

</aside>

함수 스코프(function-scoped)

함수 몸체에 선언한 변수는 해당 함수 몸체 안에서만 접근 가능. var 변수 타입이 함수 스코프 변수이다.

function a() {
  var secret = '12345'; 
}
secret; // ReferenceError -> var 키워드 변수 secret은 함수 스코프 변수이기 때문이다.

스코프 체인

함수 print를 실행할 때 해당 함수의 스코프에 사용하고자 하는 변수가 없을 때 스코프 체인에 의해 해당 변수를 찾게 된다.

var a = 1;         // 전역 스코프
function print() { // 함수 스코프
 console.log(a);
}
print();           // 1

블록 스코프

{ }로 둘러싸인 부분을 블록이라 한다. ES6에서 새로 추가된 let, const 키워드 변수는 블록 단위 변수이다.

function loop() {
  for (let i = 0; i < 5; i++) {
    console.log(i);
  }
  console.log('final', i);  // ReferenceError: i is not defined -> let은 블록 단위 변수이기 때문
}
loop();
function makeAdder(){
	for (let i = 0; i < 10; i++){
		var x = 1;  // 함수 스코프 변수
    let y = 2;  // 블록 스코프 변수
	}
  console.log("in x",x); // 1
  console.log("in y",y); // ReferenceError: y is not defined -> for문 안에서만 유효
    return;
}
makeAdder();
console.log("out x",x); // ReferenceError: x is not defined -> 함수 안에서만 유효