var name = 'mike';
console.log(name); //mike
var name = 'jane';
console.log(name); // jane
var name;
console.log(name); //undefined
name = 'mike'; //여기서 할당
호이스팅
스코프 내부 어디서든 변수 선언은 최상위에 선언된 것 처럼 행동
let age = 30;
function showAge(){
console.log(age);
let age = 20; //있으면 에러 발생, 없으면 에러x
}
let은 var와 달리 ReferenceError가 뜬다.
그 이유는 let 과 const는 TDZ(Temporal Dead Zone)의 영향을 받기 때문
즉 할당을 받기전에는 사용할 수 없다.
-> 코드를 예측가능하게 하고, 잠재적인 버그를 줄일 수 있다.
console.log(name); //ReferenceError
let name = 'mike';
var는 선언과 동시에 초기화가 된다. 따라서 할당전에 호출하면 에러를 내지 않고 undefiend를 낸다.
let은 hoisting되면서 선언단계가 이뤄지지만 초기화 단계는 실제 코드에 도달됐을때 된다.
var: 함수 스코프
-> 함수 내에서 선언한 변수만 지역변수가 된다.
let, const: 블록 스코프
-> 모든 코드 블록에서 선언된 변수는 코드 블록 내에서만 유효하며 외부에서는 접근할 수 없음, 즉, 코드내부에서 선언한 변수는 지역변수
예를들어 if문 안에서 선언한 변수는 if문 밖에서도 사용 가능
하지만 let, const는 if문 안에서만 사용가능
const age = 30;
if(age > 19){
var txt = '성인';
}
console.log(txt); //'성인'
var도 한수내에서 선언하면 함수 밖에선 사용 불가능, 유일하게 벗어날 수 없는 스코프가 함수
function add(num1, num2){
var result = num1 + num2;
}
add(2,3);
console.log(result); // -> Uncautcht ReferecneError 발생
예측 가능한 결과를 내고 버그를 없앨수 있다는 점에서 var보다는 let, const 사용을 권장한다.
출처: https://www.youtube.com/watch?v=4_WLS9Lj6n4&t=7106s&ab_channel=%EC%BD%94%EB%94%A9%EC%95%99%EB%A7%88