자바스크립트 호이스팅이란?

2020. 6. 23. 17:41·개발/JavaScript

자바스크립트에서 호이스팅(hoisting)이란 무엇일까? 호이스팅을 이해하려면 스코프의 개념과 전역 변수, 지역 변수의 의미를 이해해야 한다. 이번 포스팅에서는 변수 호이스팅과, var, let, const 키워드의 사용, 함수 호이스팅에 대해 정리해 보려 한다.

자바스크립트 변수 호이스팅

자바스크립트는 기본적으로 위에서 아래로 차례차례 코드를 실행해 간다. 따라서 변수를 선언하기 전에, 변수를 호출하면 오류가 발생해야 한다. 그러나 자바스크립트의 호이스팅 기능은 모든 변수 선언문이 해당 스코프의 최상단으로 끌어 올려 처리한다.

console.log(bear); // undefined

bear = "A market is in bearish trend.";

console.log(bear); // "A market is in bearish trend.";

var bear;

변수를 선언하기 전에 먼저 출력을 했지만, 프로그램은 '정상적'으로 실행되었다. 첫 번째 console.log(bear); 에서 undefined 가 나오는 이유는 값 할당 이전에 변수를 참조했기 때문이다. 즉, 해당 코드는 다음과 같은 순서로 실행된다.

var bear;

console.log(bear); //undefined

bear = "A market is in bearish trend.";

console.log(bear); // "A market is in bearish trend.";

var 대신 let, const를 사용해야 하는 이유

ES5까지는 변수를 선언하는 유일한 키워드는 var 뿐이었다. 그러나 var는 중복 선언이 가능하기 때문에, 프로그래머의 실수로 값이 재할당되는 실수가 발생하기도 했다.

 

이러한 단점을 보완하기 위해 ES6부터 새로운 변수 키워드인 let과 const가 등장했다. 차이점은 let은 재할당이 가능하지만, const는 재할당이 불가능하다는 것이다. 그러나 const에 객체를 할당한 경우, 값을 변경할 수 있기 때문에 언제나 고정된 값은 아니다.

 

정리하자면, 기본적으로 const를 사용하되, 재할당이 필요한 경우에는 let을 사용하는 것이 좋다.

함수 호이스팅

다음의 경우처럼 함수 정의 이전에 함수를 호출해도 이는 정상적으로 함수가 실행된다. 함수 호이스팅 때문이다.

bear(); // "A market is in bearish trend."

function bear() {
    console.log("A market is in bearish trend.");
}

이러한 함수 호이스팅은 스코프 단위로 작동한다.

var x = 'global';

function foo() {
    console.log(x); // undefined
    var x = 'local'; 
}

foo();
console.log(x); // global

그러나 모든 함수가 호이스팅 되는 것은 아니다. 다음처럼 함수 표현식을 통해 만든 함수는 호이스팅 되지 않는다. 이 경우 함수 호이스팅이 아닌 변수 호이스팅이 발생하는 것이며, 따라서 이를 참조하면 undefined가 된다. undefined를 호출할 수는 없으므로, 타입 에러가 발생한다.

bear(); //  bear is not defined

let bear = function () {
    console.log("A market is in bearish trend.");
}

'개발 > JavaScript' 카테고리의 다른 글

자바스크립트 기본 개념 공부 내용 정리  (0) 2020.06.25
Returing과 Mutating 차이점 (정리 중)  (0) 2020.06.21
자바스크립트 고차 함수(higher-order function)란?  (0) 2020.06.21
'개발/JavaScript' 카테고리의 다른 글
  • 자바스크립트 논리 연산자 설명: ||, &&, !
  • 자바스크립트 기본 개념 공부 내용 정리
  • Returing과 Mutating 차이점 (정리 중)
  • 자바스크립트 고차 함수(higher-order function)란?
휘Hwi
휘Hwi
여행, 사진, 개발, 책 이야기를 기록하는 여행자 휘의 블로그 𓂍
  • 휘Hwi
    휘: 끝나지 않은 이야기
    휘Hwi
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 기록
        • 일상 에세이
        • 인사이트
        • 투자와 재테크
        • 코인 이야기
        • 아카이빙
        • 집무실 레터
        • 사랑에 대하여
        • 번역 이야기(完)
        • 프리랜서 일지(完)
      • 여행
        • 🌎 세계 여행기 S1 (完)
        • 🌊 삼삼한 여행기 (完)
        • 🚶 온더로드
        • 🇯🇵 일본
        • 🏝️ 발리
        • 🇻🇳 베트남
        • 🇱🇰 스리랑카
        • 🇮🇳 인도
        • 🇹🇭 태국
        • 🇸🇬 싱가포르
        • 🇦🇺 호주
        • 🇭🇰 홍콩
        • 🇰🇷 한국
        • 🍚 여행자의 한 끼
        • ℹ️ 여행 정보
      • 사진
        • 사진가
        • 사진 이론과 생각
        • 사진 관련 정보
      • 영상
        • 파이널컷 모션 공부
        • 고프로 GoPro
        • 영상 관련 정보
      • 책
        • 책 읽고 쓰기
      • 개발 N
        • 티스토리
        • Internet
        • HTML
        • CSS
        • JavaScript
        • Typescript
        • React
        • Node.js
        • Express
        • NestJS
        • Python
        • Django
        • MySQL
        • MongoDB
        • AWS
        • Deployment
        • Terminal
        • Git N
        • Glossaries
        • Articles
        • Projects
        • TIL;
      • 미분류
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
휘Hwi
자바스크립트 호이스팅이란?
상단으로

티스토리툴바