19 January 2014

자바스크립트의 hoisting

자바스크립트에서 함수가 차지하는 영역은 매우 중요하며, 함수의 동작을 제대로 이해해야지만 모듈러 패턴이나 프로토타입을 활용한 상속등을 이해할 수 있다. 오늘은 가볍게 자바스크립트 함수안에서 일어나는 변수의 호이스팅에 대해서 정리해본다. 자바스크립트 변수는 block scope가 없으며 , function scope만이 존재한다. 즉 함수안에서 선언된 변수는 함수내의 어디에서나 접근 가능하다.

아래의 예시를 보자.

function test(){
    var hello = 'hello' ,
        pass = true ;
    
    if(pass){
        for(var i = 0 ; i < 3 ;i++){
            console.log(i) ; //0,1,2  가 출력된다.
        }
    }

    console.log(i) ; //3이 출력된다.
} 

위의 예제에서 보는 것처럼 if문 block안에서 i라는 변수를 선언했지만 if문 block 밖에서도 접근이 가능하다. 즉 자바스크립트 함수내에서 선언된 변수는 그 변수가 선언된 함수내에서 어디서나 접근이 가능하다. 이 개념을 우선 머리속에 넣어두고 다음 예제를 살펴보자.

var global = "I'm a global variable" ; 

function hoisting(){ 
    console.log(global) ; //1번 출력
    var global  = "I'm not a global variable" ;
    console.log(global) ; //2번 출력
} 

hoisting() ; 
console.log(global) ; //3번 출력

위의 예제의 출력결과는 어떻게 될까?

1번 출력 : undefined
2번 출력 : I'm not a global variable
3번 출력 : I'm a global variable

1번 출력에서 I'm a global variable이 출력될거라 생각했을지도 모른다. 하지만 다시 앞서 말한부분을 상기시켜보자. 여기서 잠깐 3번출력에 대해서 의문이 있다면 지금은 간단하게 생각하자. 'var' keyword가 붙은 변수는 local 변수이며 , global 변수와 이름이 같을때는 local 변수를 우선시 한다고 정리하자.

함수내에서 선언된 변수는 그 변수가 선언된 함수의 내부 어디서나 접근이 가능하다.

자바스크립트의 함수 동작을 다시 한번 상기시켜볼 필요가 있다. 자바스크립트는 함수내의 선언된 변수를 모두 함수의 최상단으로 모두 올려 놓는다. 이것을 호이스팅(hoisting)이라고 하는데 , 이 함수 호이스팅 때문에 위와 같은 결과가 나온것이다. 즉, 위의 예제를 자바스크립트가 동작하는대로 다시 풀어보면 ,

var global = "I'm a global variable" ; 

function hoisting(){ 
    var global ; 
    console.log(global) ; //1번 출력
    global  = "I'm not a global variable" ;
    console.log(global) ; //2번 출력
} 

hoisting() ; 

이렇게 동작하는 것과 동일하다.

그래서 자바스크립트에서는 single var pattern이라고 해서

function example(){ 
    var i = 0 , 
        arr = [] ,
        hello = 'hello' ,
        num = 123 ,
        isNull = true ; 

    console.log(i) ; 
} 

이런식으로 함수의 최상단에 하나의 var로 함수내에서 사용되는 변수들을 선언하고 값을 셋팅하는 것을 추천한다.


comments powered by Disqus