
var x = 1;
var y = 2;
// var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용함
// 초기화문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작함
var x = 100;
var y;
console.log(x); // 100
console.log(y); // 1
var x = 1;
if(true) {
var x = 10;
}
console.log(x); // 10
var i = 10;
// for문에서 선언한 i는 전역 변수임
for(var i = 0; i < 5; i++) {
console.log(i); // 0 1 2 3 4
}
console.log(i); // 5
// 이 시점에는 변수 호이스팅에 의해 이미 foo 변수가 선언됨
// 변수 foo는 undefined로 초기화됨
console.log(foo);
// 변수에 값 할당
foo = 123;
console.log(foo); // 123
// 변수 선언은 런타임 이전 암묵적 실행
var x;
var foo = 123;
// var 키워드로 선언한 변수는 같은 스코프 내 중복 선언 허용
var foo = 456;
let bar = 124;
let bar = 23; // SyntaxError
let foo = 123; // 전역 변수
{
let foo = 2; // 지역 변수
let bar = 3; // 지역 변수
}
console.log(foo); // 123
console.log(bar); //ReferenceError
console.log(foo); // ReferenceError
let foo;
런타임 이전에 암묵적으로 선언 단계가 먼저 실행되지만 초기화 단계는 변수 선언문에 도달했을 때 실행됨
만약 초기화 단계가 실행되기 이전에 변수에 접근하려고 하면 참조 에러 발생
일시적 사각지대: 스코프 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간
// 런타임 이전에 선언 단계 실행
console.log(foo); // ReferenceError
let foo; // 변수 선언문에서 초기화 단계 실행
console.log(foo); // undefined
foo = 1;
console.log(foo); // 1
let x = 1;
console.log(window.x); // undefined
console.log(x); // 1
const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화를 해야 함
const foo; // SyntaxError
{
console.log(foo); // ReferenceError
const foo = 1;
console.log(foo); // 1
}
// 블록 레벨 스코프를 가짐
console.log(foo); // ReferenceError
const foo = 1;
foo = 2; // TypeError
const TAX_RATE = 0.1;
let preTaxPrice = 100;
let afterTaxPrice = preTaxPrice + (preTaxPrice * TAX_RATE);
console.log(afterTaxPrice);
const person = {
name: 'Lee'
}
// 객체는 변경 가능한 값이므로 재할당 없이 변경 가능함
person.name = 'Kim';
console.log(person); // {name: 'Kim'}