
var x = 2;
function function_name() {
var y = 3;
}
var x = 3;
var x = 4;
var x = 5;
x = 6;
와 같은 선언이 같은 스코프 내에서 가능하다는 소리이다.
console.log(x);
var x = "안녕하세요";
가
var x;
console.log(x); //x 는 undefined 이다.
x = "안녕하세요";
라고 컴퓨터가 해석하며 해당 코드의 var 변수는 스코프 최상단으로 호이스팅 되며 undefined 값으로 초기값이 주어진다.
var x = "안녕";
var counter = 5;
if (counter > 4) {
var x = "안녕하세요";
}
console.log(x) // "안녕하세요"
let x = "안녕";
let counter = 5;
if (counter > 4) {
let y = "안녕하세요";
console.log(y);// "안녕하세요"
}
console.log(y) // y is not defined
let x = "안녕";
x = "안녕하세요";
-> 이 코드는 작동하지만
let x = "안녕";
let x = "안녕하세요:;
-> 이 코드는 에러를 생성한다.
let x = "안녕";
if(true){
let x = "안녕하세요";
console.log(x) // "안녕하세요"
}
console.log(x) // "안녕"
-> 이러한 이유로 해당 코드는 에러를 생성하지 않는다.
const 는 말그대로 constant 이므로,,,
이러한 이유로 모든 const 선언은 선언과 동시에 값이 주어져야만 한다.
이러한 const 의 behavior 은 object 를 선언할때는 조금 달라진다. const 키워드로 선언된 object 는 업데이트 될 수 없지만 해당 object의 properties는 업데이트가 가능하다.
const x = {
text = "안녕",
counter : 3
}
에서
x = {
message: "안녕하세요",
number: "three"
} //error: Assignemnt to constant variable.
는 불가능 하지만
x.text = "안녕하세요";
는 에러 메세지 없이 const 로 선언된 x object 의 property 인 text 를 에러 없이 업데이트 한다.
1) var 선언은 globally scoped 또는 locally/function scoped 이며 let 과 const 는 block scoped 이다.
2) var 변수는 해당 scope 내에서 업데이트 및 재 선언이 가능하지만; let 변수는 업데이트는 가능하지만 재 선언은 불가하며; const 변수는 업데이트 재 선언 둘다 불가 하다.
3) var, let, const 모두 해당 scope 의 최 상단으로 hoisting 되지만 var 변수는 undefined 의 초기 값을 가지게 되며, let 과 const 변수는 초기화 되지 않는다. ( 에러가 뜸)
4) var 과 let 은 초기화(선언시 값을 주어주는 것) 없이 선언이 가능하지만 const 는 반드시 선언과 동시에 초기화를 해주어야 한다.