// var는 한번 선언된 변수를 다시 선언 가능
var name = 'mike';
console.log(name); // mike
var name = 'jihwan';
console.log(name);//jihwan
let name = 'jane';
console.log(name); /// jane
let name = 'jihwan';
console.log(name); // error!
var는 선언하기 전에 사용 가능
console.log(name); // undefined
var name = 'mike';
var로 선언한 모든 변수는 코드가 실제로 이동하진 않지만, 최상위로 끌어올려진것처럼 동작 = 호이스팅 발생
할당은 호이스팅 되지 않는다.
같은 상황에서 let은 오류
let과 const는 호이스팅 되지 않는걸까? No!
Temporal Dead Zone (TDZ)때문 TDZ 영역에 있는 변수들은 사용할 수 없음
할당을 하기 전에는 사용할수없다.
// 문제가 발생하지 않는 코드
let age = 30;
function showAge() {
console.log(age);
}
showAge();
// 문제 발생 코드
let age = 30;
function showAge() {
console.log(age); // TDZ
let age = 20; // 호이스팅 발생
}
showAge();
선언 단계
초기화 단계
할당 단계
선언 및 초기화 단계 (초기화 undefined를 할당해주는 단계)
할당 단계
var는 함수스코프 (함수 내에서 선언된 변수만 그 지역변수이다.)
선언 단계
초기화 단계
할당 단계
-> 호이스팅 되며 선언 단계가 이루어지지만, 초기화 단계는 코드에 도달 했을 때 된다.
-> 그렇기 때문에 레퍼런스 에러 발생
let과 var는 선언만 해두고 나중에 할당허용
const gender; //error발생 바로 할당하지 않아서.
gender = 'male';
블록 스코프는 모든 코드 블럭 내에서 선언도니 변수는 코드 블록 내에서만 유효하다.
코드 블록 내에서만 유효하다.
즉 코드 블록 내부에서 선언한 변수는 지역 변수이다.
if문 안에서 var로 선언한 변수는 if문 밖에서도 사용 가능 하다.
let과 const는 중괄호 안에서만 사용가능하다.{블록스코프}
const age = 30;
if (age > 15){
var txt = '성인';
}
console.log(txt); // 성인
function add(num1,num2){
var result = num1 + num2;
}
add(2,3);
console.log(result);
//var도 함수 내에서 선언되면 함수 밖에서 사용못함
//유일하게 벗어날 수 없는 스코프가 함수이다.