
LET, CONST,VAR 차이

var name; 호이스팅 되기 때문이다.
여기서 선언은 호이스팅 되지만 할당은 호이스팅 되지 않습니다.

사실 let과 const 도 호이스팅 됩니다.
호이스팅 : 스코프 내부 어디서든 변수 선언은 최상위에 선언된 것 처럼 행동
그런데 var처럼 행동하지 않고 왜 에러를 내는 것 일까요?
Temporal Dead Zone

TDZ 있는 영역에 있는 변수들은 사용할 수 없습니다. Let과 const는 TDZ의 영향을 받습니다. 할당을 하기전에는 사용할 수 없습니다. 이는 코드를 예측가능하게 하고 잠재적인 버그를 줄일 수 있습니다.

현재 위 코드는 문제가 없습니다.

현재 위에 코드는 문제가 있습니다.
변수는 생성과정에서 삼단계 과정을 거칩니다.
1. 선언단계
2. 초기화 단계
3. 할당 단계
VAR
LET
1. 선언 단계
2. 초기화 단계
3. 할당 단계
호이스팅되면서 선언 단계 이루어지고 초기화 단계는 실제 코드에 도달했을때 이기때문에 레퍼런스 에러가 난다.
CONST
1. 선언 및 초기화 및 할당

선언하면서 바로 할당을 안했기때문에 에러가 납니다.

블록 스코프는 모든 코드 블록내에 선언된 변수는 코드블록 내에서만 유효하며
외부에서는 접근할 수 없다라는 의미 입니다.
즉 코드블록 내부에서 선언한 변수에서는 지역변수이다. 여기서 말하는 코드블록은 함수 이프문 포문 등등입니다.
반면 함수 스코프 는 함수 내에서 선언된 변수만 그 지역의 지역변수가 됩니다.

var는 이렇게 해서 사용할 수 있지만 let과 const는 이렇게 사용할 수 없습니다.
유일하게 벗어날 수 없는 스코프가 함수 스코프라고 합니다.
결론 : 함수 스코프는 나올 수 없고 블록 스코프 안에서 var는 나올 수 있습니다.


실제로 위와 같이 this = {} 는 없지만 있는것 같이 행동하고 return this를 반환하는 것 과 같습니다.
위 두줄은 작성하지 않아도 new로 작성하게 되면 자동으로 알고리즘이 실행해줍니다.
그래서 new 를 붙여서 실행시키면 위와같은 코드가 동일하게 실행됩니다.
생성자 함수는 첫 글자를 대문자로 하는게 관례입니다.
이번에는 메소드를 추가해보겠습니다.



new를 안붙이면 그냥 함수가 실행되는 겁니다. 이 함수는 아무것도 리턴해주는게 없기 때문에 undefined가 뜨는겁니다.
그래서 꼭 생성자 함수는 new를 붙여주어야 합니다.
(생성자 함수(Constructor Function)는 객체를 만들고 기존 객체의 속성에 대한 값을 설정하는 특수 함수입니다.)




















hasown 프로퍼티는 객체가 직접 가지고 있는 프로퍼티만 반환합니다.

