일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 배열파티션
- v-model
- 10926번
- v-if
- DevOps
- 2588번
- 3003번
- v-for
- 파이썬
- 도커
- 프리코스
- MSA
- 이벤트캡쳐링
- 이벤트버블링
- 리스트복사
- 10869번
- 객체지향의 사실과 오해
- 백준
- 우테코
- JavaScript
- v-on
- Python
- 코어자바스크립트
- vue
- 쿠버네티스
- 빅오표기법
- hoisting
- 실행 컨텍스트
- 젠킨스
- LeetCode
Archives
- Today
- Total
새오의 개발 기록
javascript: hoisting 호이스팅 본문
호이스팅
코드 실행 전에 변수나 함수의 선언들을 모두 끌어올려서 해당 스코프의 최상단에 끌어올려 선언하는 것.
변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것
변수의 생성 단계
1. 선언 단계(Declaration Phase)
- 변수를 변수 객체(Variable Object)에 등록함.
- 변수 객체는 스코프가 참조하는 대상이 됨.
2. 초기화 단계(Initialization Phase)
- 변수 객체에 등록된 변수를 위한 공간을 메모리에 확보
- 이 단계에서 var는 undefined로 초기화 됨
3. 할당 단계(Assignment Phase)
- var: undefined로 초기화된 변수에 실제 값을 할당함
- let, const: 변수에 실제 값을 할당함
호이스팅의 대상
var, let, const를 포함한 모든 선언을 호이스팅 함
var | let / const |
선언 단계와 초기화 단계가 한 번에 이루어짐 | 선언 단계와 초기화 단계가 분리되어 이루어짐 |
선언 단계에서 undefined로 초기화되기 때문에 변수 선언문 이전에 접근해도 에러가 발생하지 않고 undefined를 반환하게 됨 | 스코프에 변수를 선언은 하지만, 변수 선언문에 도달해서야 초기화가 이루어지기 때문에 초기화 이전에 변수에 접근하게 되면 참조 에러(Reference Error)가 발생 |
ex 1
console.log(num); // 호이스팅한 var 선언으로 인해 undefined 출력
var num; // 선언
num = 6; // 초기화
console.log(age); // 선언만 호이스팅되며, 초기화 전이라 reference error
let age; // 선언
age = 3; // 초기화
호이스팅 우선순위
변수 선언이 함수 선언보다 높은 우선순위를 가짐
var myName = "hi";
function myName() {
console.log("yuddomack");
}
function yourName() {
console.log("everyone");
}
var yourName = "bye";
console.log(typeof myName); // string
console.log(typeof yourName); // string
정리
호이스팅은 선언된 변수와 함수들을 모두 끌어올려 유효 범위 내의 최상단에 선언하는 것을 말합니다.
호이스팅이 발생하는 원인은 함수와 변수의 선언과 초기화가 분리되기 때문인데 var와 let, const 모두 hoisting 대상이지만
var의 경우 변수 선언과 동시에 undefined로 초기화가 일어나기 때문에 선언 전에 참조하더라도 에러가 발생하지 않고 undefined가 출력되지만, let과 const의 경우 선언만 되고 초기화 되지 않았기 때문에 선언 전에 참조 하면 Reference Error가 발생합니다.
'Javascript' 카테고리의 다른 글
Javascript: Array.fill() (0) | 2023.01.14 |
---|---|
Javascript: fs 모듈로 입력 받기 (0) | 2023.01.12 |
Javascript: 이벤트 버블링과 캡쳐 (0) | 2022.09.28 |
Javascript: 비동기 처리 (0) | 2022.09.28 |
Javascript: 동기와 비동기의 차이 (0) | 2022.09.27 |