- 변수 중복 선언 허용
var x =1;
var y =1;
var x = 100; //초기화문이 있으니까 재할당
var y; //없으니까 무시되고 원래 선언을 따른다
console.log(x); //100
console.log(x)//1
var 키워드로 선언한 변수
함수의 코드블록만을 지역 스코프로 인정
코드 블록 내 선언 시 전역변수
문제 : 전역 변수 쉽게 변경됨
var x =1;
if(true){
//x는 전역 변수. 중복선언
var x =10;
}
console.log(x)
var i=10;
//for문에서 선언된 i는 전역 변수, 이미 선언된 전역 변수 i가 있으므로 중복 선언
for(var i=0; i<5;i++){
console.log(i);
}
console.log(i); //5
console.log(foo) ; //undefined
foo = 123;
console.log(foo) //123
var foo; //암묵적으로 이미 실행되어 있음
var의 단점을 보완하기 위해 ES6부터 let, const를 도입했다
중복 선언하면 문법 에러 발생.
let bar = 123;
//let, const 키워드로 선언된 변수는 스코프 내에서 중복 선언 허용 X
let bar = 456; //syntaxerror
let 키워드로 선언한 변수
let foo=1;
{
let foo = 2;
let bar = 3;
}
console.log(foo) //1
console.log(bar) //not defined
코드 블록 안 foo 변수와 bar변수 : 지역 변수
let i=10; //전역 스코프
function foo(){ //함수 레벨 스코프
let i=100;
for(let i=1; i<3; i++){ //블록 레벨 스코프(위의 i와 다른 i)
console.log(i)//1, 2
}
console.log(i)//100
}
foo();
//함수 실행했을 때 지역변수 i가 생성된다
console.log(i);
let키워드로 선언한 변수
console.log(foo); //referenceError : foo is not defined
let foo;
var 키워드
선언 + 초기화 -> 할당
let 키워드
선언 단계와 초기화 단계 분리되어 진행
런타임 이전에 자바스크립트 엔진에 의해 암묵적으로 선언 단계가 먼저 실행
초기화 단계는 변수 선언문에 도달했을 때 실행 된다(초기화를 미리하지 않는다)
초기화 단계 실행되기 이전에 변수에 접근 시 참조 에러
스코프의 시작 지점부터 초기화 단계 시작 지점(변수 선언문)까지 참조 불가능
TDZ(일시적 사각지대) : 스코프의 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간
선언 (TDZ)-> 초기화 -> 할당
//생성은 됐는데 초기화가 안되어서 not defined
//let foo전까지 TDZ
console.log(foo); //ReferenceError: not defined
let foo;
console.log(foo); //undefined
foo=1;
console.log(foo) //1
let키워드로 선언한 변수
let foo=1;
{
console.log(foo); //ReferencError : cannot access ~
let foo=2; //지역 변수
}
var x =1; //전역 변수
y=2; //암묵적 전역
function foo(){ } //전역 함수
console.log(window.x)
console.log(x)
console.log(window.y)
console.log(y);
console.log(window.foo);
console.log(foo);
let x=1;
console.log(window.x)//undefined
console.log(x)//1
const bar; //SyntaxError: Missing initializser in const declaration
{
console.log(foo) //ReferenceError (선언된 거는 인식을 함. TDZ일 뿐)
const foo=1; //할당이 되어서 아래서 참조 가능
console.log(foo);//1
}
console.log(foo)//not defined
var, let키워드와 달리 재할당 금지
const foo = 1;
foo=2; //typeError
const 키워드로 선언한 변수에 원시값을 할당한 경우 변수 값 변경 불가능
원시 값은 변경 불가능한 값이므로 재할당 없이 값 변경 불가능
그러므로 const로 상수 표현하기도!
const 변수 = 원시 값
//재할당 금지 //변경 불가
상수
-재할당이 금지된 변수
-값 저장용 메모리 공간 필요하므로 변수긴 함 (재할당 여부의 차이)
-대부분 대문자로 선언해 상수임을 명확히 나타낸다
-여러 단어 시 언더스코어로 구분(스네이크 케이스) ex. const TAX_RATE
장점
- 상태 유지
- 가독성
- 유지보수의 편의 : 나중에 변경 시 상수만 변경하면 되므로
const 변수 = 객체
-mutable value이므로 변경 가능
-재할당 없이 직접 변경 가능
-즉 const는 재할당 금지뿐 불변 X(변수에 할당된 참조 값은 변경 X)
const person = {
name : 'Lee'
}
person.name = 'Kim'
console.log(person.name)//'Kim'
추천 순
const
let
var