JS

var이랑 let,const 차이점

gurwhddl 2022. 11. 30. 01:07

var는 함수 스코프고 나머지는 블록 스코프임

스코프란 ?

  • 식별자가 본인이 선언된 위치에 따라 다른 코드에서 본인이 참조될 수 있는지 없는지가 결정되는 범위
if(true){

var a = 1}

console.log(a) // 1

var 키워드는 함수 스코프 -> 함수가 선언되어야 새로운 컨텍스트가 생성되고, 스코프가 결정됨

이 경우에는 함수가 선언된 게 아니기 때문에 그냥 전역 컨텍스트에서 a = 1로 저장된것과 마찬가지가 됨

  • 만약 var가 아니었다면 ?
    블록이 선언되었기 때문에 새로운 실행 컨텍스트가 콜스택에 쌓이고 a = 1이라고 선언한 후(간단하게 표현함) 실행 컨텍스트가 콜스택에서 빠져 나가면서 전역 컨텍스트에는 a라는 변수가 선언된 적이 없기 때문에 referenceError가 발생함
for (var i = 0; i <= 5; i++) {
setTimeout(() => console.log(i),1000*i);
}

=> 결과는 1초,2초~5초 뒤에 console은 모두 5가 찍힘

함수 스코프라는 뜻은 함수가 선언되어야 새로운 컨텍스트가 생기고, 스코프가 결정됨 - 저 콜백함수들은 모두 동일한 스코프를 참조하고 있다는 것

  • i값이 마치 전역 변수처럼 동작함

그러면 왜 timer는 0초,1초...마다 작동하나 ? 이건 스코프랑 관련없이 반복문이 실행되면서 그때의 i값에 따라 timer를 작동시키는 거

let으로 하면?

  • 반복문이 실행될때마다 각 콜백함수가 정의되면서 스코프가 결정되고, 타이머가 끝나고 실행될 때 본인들의 블록 스코프에서의 i값을 참조해서 console에 찍어줌