WEB/JavaScript

[Javascript] 호이스팅(hoisting)

S0PH1A 2020. 11. 10. 22:18
반응형

[Javascript] 호이스팅(hoisting)

 

* 호이스팅?
  - '끌어올리다'라는 의미.
  - 변수 정보를 수집하는 과정을 더웃 이해하기 쉬운 방법으로 대체한 가상의 개념.
  > 출처: 도서 '코어자바스크립트'

 

 

 호이스팅 규칙: 함수 선언, 변수명을 위로 끌어올리고 할당과정은 원래 자리에 그대로 남겨둔다.

 

 

 

아래 코드를 실행해보면 어떻게 될까? 한번 머릿속으로 예상해보자.

var x = 1;

console.log('x - (1): ', x);
console.log('y - (1): ', y);
console.log('a - (1): ', a);
console.log('b - (1): ', b);
console.log('c - (1): ', c);
e(3);

var y = 2;

function a() {
    console.log('function a');
}

var b = function () {
    console.log('function b');
};

var c = function d() {
    console.log('function d');
};

function e(z) {
    console.log('z - (1): ', z);

    var z = 4;
    console.log('z - (2): ', z);

    function z() {
        console.log('function z');
    }
}

console.log('x - (2): ', x);
console.log('y - (2): ', y);
console.log('a - (2): ', a);
console.log('b - (2): ', b);
console.log('c - (2): ', c);
e(3);

 

아마, 아래와 같이 실행될 것이라고 예상된다.

x - (1):  1
y - (1):  undefined
a - (1):  undefined
b - (1):  undefined
c - (1):  undefined
e : 선언되지 않았으므로 Error 발생!
x - (2):  1
y - (2):  2
a - (2):  [Function: a]
b - (2):  [Function: b]
c - (2):  [Function: d]
z - (1):  3
z - (2):  4

 

...하지만, 아니다!

 

직접 코드를 실행해보면 위와 같이 출력되지 않는다!

대부분 위에서 아래로, 좌에서 우로 읽기 때문에 위와 같을 것이라 생각하지만

자바스크립트는 처음에 컨텍스트 내부 전체를 쭉 읽어가면서 순서대로 선언된 함수, 식별자 등을 수집하기 때문에 아래와 같이 출력이 된다.

x - (1):  1
y - (1):  undefined
a - (1):  [Function: a]
b - (1):  undefined
c - (1):  undefined
z - (1):  [Function: z]
z - (2):  4
x - (2):  1
y - (2):  2
a - (2):  [Function: a]
b - (2):  [Function: b]
c - (2):  [Function: d]
z - (1):  [Function: z]
z - (2):  4

 

그럼 어떻게 위와 같이 출력이 되는 걸까?
그 원리는 다음과 같다.

맨위에 설명한 호이스팅 규칙에 따라 var 로 선언된 변수와 함수 선언을 가장 맨위로 끌어올리기 때문이다.

var x;
var y;
function a() {
    console.log('function a');
}
var b;
var c;
function e(z) {
    var z;
    function z() {
        console.log('function z');
    }

    console.log('z - (1): ', z);
    z = 4;
    console.log('z - (2): ', z);
}

x = 1;

console.log('x - (1): ', x);
console.log('y - (1): ', y);
console.log('a - (1): ', a);
console.log('b - (1): ', b);
console.log('c - (1): ', c);
e(3);

y = 2;
b = function () {
    console.log('function b');
};
c = function d() {
    console.log('function d');
};

console.log('x - (2): ', x);
console.log('y - (2): ', y);
console.log('a - (2): ', a);
console.log('b - (2): ', b);
console.log('c - (2): ', c);
e(3);

 

 

 

 


[참고] 도서 `코어 자바스크립트`

반응형