// 6_hoisting.js
/**
* Hoisting 기본개념
*/
console.log('Hello'); // Hello
console.log('World'); // World
console.log('----------');
// 정상 출력
// var name = '코드팩토리';
// console.log(name); // name
// 그런데 만약 var 키워드로 선언한 변수 전에
// name을 호출하면 어떻게 될까?
// 보통은 오류가 날꺼라고 생각하지만
// undefined가 출력
console.log(name); // undefined
var name = '코드팩토리';
console.log(name);
// 그런데 우리가 변수의 값이 undefined가 나오는 경우는
// 변수를 선언하고 직접 값을 초기화하지 않았을때 지정되는 값이라고 데이터 타입에서 배움
// 그래서 위 코드는 아래와 같이 동작
// var name;
// console.log(name);
// name = '코드팩토리';
// console.log(name);
/**
* Hoisting은 무엇인가? (기본개념)
*
* 모든 변수 선언문이 코드의 최상단으로 이동되는 것처럼 느껴지는 현상을 이야기한다.
*/
// var name;
// console.log(name);
// name = '코드팩토리';
// console.log(name);
// var 키워드 말고 let과 const는 어떨까?
// let과 const도 호이스팅이 된다.
console.log(river); // error - Cannot access 'river' before initialization
let river = 'riverkim';
// river라는 변수를 초기화 하기 전에 접근할 수 없다는 오류 발생
// -> let은 호이스팅이 안되는거 아닌가?
// river라는 변수를 지워보자
console.log(river); // error - river is not defined
// river가 정의되지 않았다.
// 결론적으로 river 라는 변수가 없다면 river is not defined 라는 에러가 나와야하는데
// 오류사항을 보면 river라는 변수는 있지만(존재는 함) 실제 값(riverkim)을 할당하기 전에는 접근할 수 없음
// var 보다 let과 const를 사용해야 하는 이유 중 하나는 호이스팅을 피하기 위해서
// const도 let과 마찬가지로 동작
// console.log(yuJin);
// const yuJin = '안유진';