호이스팅(Hoisting)이란?
자바스크립트(JavaScript)에서 변수와 함수 선언이 스코프 내에서 코드의 맨 위로 끌어올려지는 동작
*아래 예시들은 위에서 부터 순서대로 코드가 작성 되었다고 가정.
Temporal Dead Zone (TDZ) : ECMAScript 6(ES6)에 도입된 개념으로
let 또는 const 키워드를 사용하여 호이스팅 시 선언 이후 초기화 되기전 머무르는 일시적인 죽음의 지대(?)로
초기화 이전에 접근하려고 하면 참조 에러를 발생 시킴
// 변수
console.log(examVar); // undefined 가 출력
/* var 는 변수 선언이 호이스팅되고 변수 초기화 전에 우선 undefined 로 초기화 되어 undefined 출력시킴 */
var examVar = 10;
console.log(examLet); // Uncaught ReferenceError: Cannot access 'examLet' before initialization
/* let 은 변수 선언이 호이스팅되고 변수 초기화는 실제 선언 위치에서 이루어 지며, 초기화 이전에 변수에 접근하면
"Temporal Dead Zone (TDZ)"에 들어가서 ReferenceError (참조 에러)를 발생시킴 */
let examLet = 10;
console.log(examConst); // Uncaught ReferenceError: Cannot access 'examConst' before initialization
/* const 는 변수 선언이 호이스팅되고 변수 초기화는 실제 선언 위치에서 이루어 지며, 초기화 이전에 변수에 접근하면
"Temporal Dead Zone (TDZ)"에 들어가서 ReferenceError (참조 에러)를 발생시킴 */
const examConst = 10;
// 함수
sayHello(); // "Hello, guys!" 출력
/* 함수 선언식으로 명시할 경우 함수 선언 및 초기화가 호이스팅되어 "Hello, guys!" 출력시킴 */
function sayHello() {
console.log("Hello, guys!");
}
sayHelloVar(); // Uncaught TypeError: sayHelloVar is not a function
/* var 에 할당, 함수 표현식으로 명시할 경우, 함수 선언이 호이스팅되고 undefined 로 초기화 하고
함수의 초기화는 함수 표현식 작성 위치에서 초기화 되기에 위 같은 에러를 발생시킴 */
var sayHelloVar = function() {
console.log("Hello, guys!");
}
sayHelloLet(); // Uncaught ReferenceError: Cannot access 'sayHelloLet' before initialization
/* let 에 할당 함수 표현식 작성, 함수 선언이 호이스팅되고 함수 초기화는
함수 표현식 작성 위치에서 이루어 지며 초기화 이전에 함수를 호출하려고 하면
"Temporal Dead Zone (TDZ)"에 들어가서 ReferenceError (참조 에러)를 발생시킴 */
let sayHelloLet = function() {
console.log("Hello, guys!");
}
sayHelloConst(); // Uncaught ReferenceError: Cannot access 'sayHelloConst' before initialization
/* const 에 할당 함수 표현식 작성, 함수 선언이 호이스팅되고 함수 초기화는
함수 표현식 작성 위치에서 이루어 지며 초기화 이전에 함수를 호출하려고 하면
"Temporal Dead Zone (TDZ)"에 들어가서 ReferenceError (참조 에러)를 발생시킴 */
const sayHelloConst = function() {
console.log("Hello, guys!");
}
'JavaScript' 카테고리의 다른 글
JSP <script></script> 스크립트 영역에서 백틱 (템플릿 리터럴) `${변수}` 사용 (0) | 2023.11.04 |
---|---|
자바스크립트 태그 text 변경 감지 (div, span, ...) (input X) with MutationObserver (0) | 2023.10.28 |
jQuery 제이쿼리 .eq() 메서드 => 순수 JavaScript (바닐라JS) 방식으로 대체 (0) | 2023.08.12 |
JS .map() / JavaScript .map() / 자바스크립트 배열 메서드 / 자바스크립트 .map() 메서드 (0) | 2023.07.23 |
JS / JavaScript function / 자바스크립트 함수 매개변수 기본값 설정 (0) | 2023.07.16 |
최근댓글