function level scope다.
함수 범위 안으로 들어가면 그 함수 내에서만 쓸 수 있다.
어떤 함수의 범위 안에도 들어가지 않았다면 전역 변수로 쓰인다.
var a = 'a'
console.log(a) // a
function varA() {
if (true) {
var a = 7
}
return a
}
console.log(varA()) // 7
var a = 'b'
console.log(a) // b
그런데 최근에는 var 변수를 호이스팅때문에 거의 안 쓴다고 한다.
function varA() {
a = 'a'
var a
return a
}
console.log(varA()) // a
호이스팅때문에 선언한 적 없는 변수에 값부터 넣고 나중에 할당하는 것이 가능하다..
block level scope다.
블록 단위로 범위가 제한된다.
중복 선언이 불가능하다.
let a = 'a'
console.log(a) // a
function letA() {
if (true) {
let a = 7
}
return a
}
console.log(letA()) // a
let a = 'b' // SyntaxError: Identifier 'a' has already been declared
letA함수 안의 a 변수는 if문의 {}안에서 선언되었기 때문에
if문이 끝남과 동시에 사라지고 전역변수 a가 반환되었다.
let변수와 마찬가지로 block level scope다.
상수는 π = 3.14 처럼 변하지 않는 값을 저장해둘 때 사용한다.
중복 선언은 당연히 불가능하고 한번 선언한 값을 바꿀 수 없다.
const a = 'a'
a = 'b' // TypeError: Assignment to constant variable.
선언과 함께 값을 할당해줘야 한다.
const a
console.log(a) // SyntaxError: Missing initializer in const declaration
함수나 조건문 안에 const 상수가 또 선언되면 오류가 날 것 같지만
{}안으로 범위가 제한되기 때문에 오류가 나지 않는다.
const a = 'a'
console.log(a) // a
function constA() {
if (true) {
const a = 7
}
const a = 'b'
return a
}
console.log(constA()) // b