전역 변수의 생명 주기는 애플리케이션의 생명 주기와 같다.
하지만, 함수 내부에서 선언된 지역 변수는 함수가 호출되면 생성되고 함수가 종료되면 소멸한다.
<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 -> 함수 안에서만 유효