Web_Miscellaneous / 기초 개념 / 1.6 호이스팅
1.6호이스팅
호이스팅이란?
1. 호이스팅의 정의
함수 안에 있는 선언들을 모두 끌어올려 해당 함수 유효 범위의 최상단에 선언하는 것
2. 세부
- 자바스크립트 함수는 실행되기 전, 함수 안에 필요한 변수 값들을 모두 모아서 유효 범위(함수 블록 안에 있는 범위)의 최상단에 선언
- 자바스크립트 parser는 함수 실행 전 함수를 한번 쭉 훑고,
- 함수 안에 존재하는 변수/함수 선언에 대한 정보를 기억하고 있다가 실행
- 즉, 실제로 코드가 끌어올려지는게 아니라 그냥 parser가 아랫쪽에 쓰여있지만 필요한 값들을 끌어올리는 것으로 실제 메모리에 변화는 없음
- 호이스팅의 대상
- var 변수 선언과 함수 선언문(function declararation)에서만 호이스팅이 일어남
- let/const 변수 선언과 함수 표현식(function expression)에서는 안됨
- 즉, function foo()에서는 되고 const foo = function()에서는 안됨.
- 함수 표현식에서는 선언과 호출 순서에 따라 정상적으로 함수가 실행되지 않을 수 있음(선언과 할당의 분리)
- var 변수 선언과 함수 선언문(function declararation)에서만 호이스팅이 일어남
javascript/* 오류 */ function printName(firstname) { // 함수선언문 console.log(inner); // > "undefined": 선언은 되어 있지만 값이 할당되어있지 않은 경우 var result = inner(); // ERROR!! console.log("name is " + result); var inner = function() { // 함수표현식 return "inner value"; } } printName(); // > TypeError: inner is not a function https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html
- console.log(inner)가 undefined인 것은, var inner=…가 함수 표현식으로 정의되어있기 때문에 얘는 함수로 인식되지 않고 undefined로 지정됨
3. 호이스팅 우선 순위
- 같은 이름의 var 변수 선언과 함수 선언에서의 호이스팅
- 변수 선언 > 함수 선언
javascriptvar 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
myName은 위에 할당/아래에 함수선언, yourName은 위에 함수선언/아래에 할당임에도 불구하고 둘다 타입은 string으로 변수 할당이 우선됨
- 값이 할당되어 있지 않은 변수와 값이 할당되어 있는 변수 ⇒ 값이 할당되어 있지 않은 변수는 함수 선언문이 변수를 덮어버림(아래 예시)
javascriptvar myName = 'Heee'; // 값 할당 var yourName; // 값 할당 X function myName() { // 같은 이름의 함수 선언 console.log('myName Function'); } function yourName() { // 같은 이름의 함수 선언 console.log('yourName Function'); } console.log(typeof myName); // > "string" console.log(typeof yourName); // > "function"
4. 주의사항
- 코드의 가독성/유지보수를 위해 호이스팅 일어나지 않게 하자
- 함수와 변수를 가급적 코드 상단부에서 선언하면 호이스팅으로 인한 스코프 꼬임을 방지 가능
- let/const 사용