var x = 1;
var y = 1;
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
let foo = 1; // 전역 변수
{
let foo = 2; // 지역 변수
let bar = 3; // 지역 변수
}
console.log(foo); //1
console.log(bar); // ReferenceError : bar is not defined
☝🏻 let 키워드로 선언한 변수는 '선언 단계'와 '초기화 단계'가 분리되어 진행된다.
= 런타임 이전에 자바스크립트 엔진에 의해 암묵적으로 선언 단계가 먼저 실행되지만 초기화 단계에서는 변수 선언문에 도달했을 때 실행된다.
🔥 스코프의 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간을 일시적 사각지대라고 부른다.
// 런타임 이전에 선언 단계가 실행된다. 아직 변수가 초기화되지 않았다.
// 초기화 이전의 일시적 사각지대에서는 변수를 참조할 수 없다.
console.log(foo); //ReferenceError: foo is not defined
let foo; // 변수 선언문에서 초기화 단계가 실행된다.
console.log(foo); // undefined
foo = 1; // 할당문에서 할당 단계가 실행된다.
console.log(foo); // 1
let foo = 1; // 전역 변수
{
console.log(foo); //ReferenceError: Cannot access 'foo' before initialization
let foo = 2; // 지역 변수
}
// 전역 변수
var x = 1;
// 암묵적 전역
y = 2;
// 전역 함수
function foo() {}
// var 키워드로 선언한 전역 변수는 전역 객체 window의 프로퍼티다.
console.log(window.x) // 1
// 전역 객체 window의 프로퍼티는 전역 변수처럼 사용할 수 있다.
console.log(x); //1
let x = 1;
// let, const 키워드로 선언한 전역 변수는 전역 객체 window의 프로퍼티가 아니다.
console.log(window.x); // undefined
console.log(x); // 1
☝🏻 상수?
- 재할당이 금지된 변수
- 변수는 언제든지 재할당을 통해 변수 값을 변경할 수 있지만 상수는 재할당이 금지된다.
const foo = 1;
const person = {
name : 'Lee'
};
person.name = 'Kim';
console.log(person); // {name: 'Kim'}