과거 javascript에서의 변수 선언은 var 하나였으나, ES6가 나온 후는 let과 const를 사용한다.
var | let | const | |
---|---|---|---|
변수 재선언 | 가능 | 불가능 | 불가능 |
값 재할당 | 가능 | 가능 | 불가능 (읽기 전용) |
호이스팅 | 된다 | 된다 | 된다 |
scope | function scope | block scope function scope | block scope function scope |
var name = "jay"
var name = "park"
console.log(name) // park
let name = "jay"
let name = "park" //Uncaught SyntaxError: Identifier 'name' has already been declared
const name = "jay"
const name = "park" //Uncaught SyntaxError: Identifier 'name' has already been declared
var name = "jay"
name = "park"
console.log(name) // park
let name = "jay"
name = "park"
console.log(name) // park
const name = "jay"
name = "park" //TypeError: "name" is read-only
block scope는 {}
로 표시되는 하나의 범위이다. (if, for, while 등등)
if(true){ // block scope
var a = "a"
let b = "b"
const c = "c"
} // block scope
console.log(a) // a
console.log(b) // ReferenceError: b is not defined
console.log(c) // ReferenceError: c is not defined
위 예제에서 보면 var의 경우 block scope 밖에서도 확인이 되는 반면에 let과 const는 확인할 수 없다. var는 block scope를 가지지 않고 function scope
를 갖는다.
function exam(){ // function scope
var a = "a"
let b = "b"
const c = "c"
}// function scope
// 전부 ReferenceError 발생
console.log(a)
console.log(b)
console.log(c)