JS 변수 Scope

업데이트:

JS Scope란?

  • ES6 전에는 var 변수 키워드만 사용 가능, 그 후로 const, let 변수 키워드가 추가됨.

var, let, const 차이점

  • var: 함수레벨의 스코프, let/const: 블록레벨의 스코프
  • var로 선언한 변수는 선언 전에 사용해도 애러 나지 않지만, let/const의 경우에는 애러가 발생
function a() {
    console.log(num1); // undefined
    console.log(num2); // Uncaught ReferenceError: num2 is not defined
    console.log(num3); // Uncaught ReferenceError: num3 is not defined

    var num1 = 1;
    const num2 = 1;
    let num3 = 1;
}
  • var은 이미 선언된 이름과 같은 이름으로 변수를 재선언 해도 애러 나지않음, but let/const의 경우 같은 이름의 변수를 재선언 할시 애러 발생
  • var/let은 선언시 초긱값을 주지 않아도 되지만, const는 반드시 초기값 할당 필요
  • var/let은 값을 다시 할당 가능 하지만, const는 한번 할당 되면 변경 불가
 // let
let a = 'test'
let a = 'test2' // Uncaught SyntaxError: Identifier 'a' has already been declared
a = 'test3'     // 가능

// const
const b = 'test'
const b = 'test2' // Uncaught SyntaxError: Identifier 'a' has already been declared
b = 'test3'    // Uncaught TypeError:Assignment to constant variable.

※ var는 function scope으로 hoisting이 일어남, let/const는 block scope으로 hoisting이 일어나지만 TDZ(Temporal Dead Zone)으로 인해 ReferenceError가 발생할 수 있음

var 대신 let/const 사용해야 되는 이유

  • 함수레벨 스코프이기 때문에, 전역 변수를 남발할 가능성을 높임
  • 변수 중복 선언 허용하기 때문에 의도하지 않은 변수의 값의 변경이 일어날 가능성 큼
  • 변수 호이스팅(hoisting)이 일어나기때문에 변수를 선언하기 전에 참조 가능해짐
  • var키워드 생략을 허용하기 때문에, 암묵적 전역 변수를 양산할 가능성이 큼

※ 대부분의 문제는 전역변수로 인해 발생
(복잡한 애플리케이션의 경우 유효범위가 넓어 어디까지 사용될 것인지 파악이 힘듬)
※ 값을 재할당 한다면 let, 재할당 안한다면 const를 사용하자!