var x = 1;
var y = 1;
// 중복 선언 허용 (var 키워드가 없는 것처럼 동작)
var x = 100;
// 초기화문이 없는 변수 선언문은 무시
var y;
console.log(x); // 100
console.log(y); // 1
var i = 10;
// for문에서 선언함 i는 전역변수 + 이미 i가 있어서 중복 선언됨..
for (var i=0; i<5; i++) {
console.log(i); // 0 1 2 3 4
}
console.log(i); // 5 => 의도치 않게 i 값이 변경됨
var 키워드로 선언한 변수는 변수 호이스팅에 의해 변수 선언문 이전에 참조할 수 있음 (할당 이전에 변수를 참조하면 undefined를 반환)
var 키워드의 단점을 보완하기 위해 ES6에서 새로운 변수 키워드인 let, const를 도입했다~
let bar = 123;
let bar = 456; // SyntaxError..!
모든 코드 블록(함수, if문, for문, try/catch문 등)을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.
let 키워드로 선언한 변수는 변수 호이스팅이 발생하지 않는 것처럼 동작
=> 변수 선언 이전에 참조하면 참조에러(ReferenceError) 발생
let 키워드로 선언한 변수는 선언 단계
와 초기화 단계
가 분리되어 진행됨
=> var 키워드 처럼 호이스팅 되어 undefined를 할당해주지 않음
이때 변수 스코프의 시작 지점부터 초기화 단계 시작 지점 까지 변수를 참조할 수 없는 구간을 일시적 사각지대라고 부른다.
var 키워드로 선언한 전역 변수나 함수는 전역 객체의 프로퍼티가 되지만,
let 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다.
상수니깐..
const 키워드로 선언된 변수의 원시 값은 변경할 수 없지만, 객체를 할당한 경우 값을 변경할 수 있다
const person = {
name: 'lee'
}
person.name = 'milou';
console.log(person); // {name: 'milou'}
const 키워드는 재할당을 금지할 뿐 "불변"을 의미하지는 않는다