티스토리 뷰

목차

    반응형

    [자바스크립트 강좌 009] 즉시 실행 함수 사용 (Javascript Function)


    함수를 정의함과 동시에 바로 실행하는 함수를 Javascript 즉시 실행 함수라고 한다. 이 함수도 익명 함수를 응용한 형태이다. 우선 다음 예제 코드를 살펴보자.


    익명 함수를 정의함과 동시에 결과가 출력된다.


    1
    2
    3
    (function (name) {
        console.log('This is the immediate function -> ' + name);
    })('foo');
    cs


    This is the immediate function --> foo


    자바스크립트 즉시 실행 함수를 만드는 방법은 간단하다.

    우선 함수 리터럴을 괄호()로 둘러싼다. 이때 함수 이름이 있든 없든 상관없다. 앞 예제에서는 function (name) { ... } 부분을 괄호로 감쌌다. 그런 다음 함수가 바로 호출될 수 있게 () 괄호 쌍을 추가한다.


    이때 괄호 안에 값을 추가해 즉시 실행 함수의 인자로 넘길 수가 있다. Javascript 예제의 경우는 ('foo')로 즉시 실행 함수를 호출했으며, 이때 'foo'를 인자로 넘겼다. 이 값은 앞 예제 즉시 실행 함수의 name 매개변수로 넘겨지게 된다.


    이렇게 함수가 선언되자마자 실행되게 만든 즉시 실행 함수의 경우, 같은 함수를 다시 호출할 수 없다. 따라서 즉시 실행 함수의 이러한 특징을 이용한다면 최초 한 번의 실행만을 필요로 하는 초기화 코드 부분 등에 사용할 수 있다.


    자바스크립트 즉시 실행 함수[Javascirpt Function] Immediately-invoked function expression


    즉시 실행 함수의 또 다른 용도를 알아보자. 그것은 바로 jQuery와 같은 자바스크립트 라이브러리나 프레임워크 소스들에서 사용된다는 것이다. jQuery의 최신 소스 코드를 살펴보면 소스의 시작 부분과 끝 부분이 다음 예제와 같이 즉시 실행 함수 형태로 구성되어 있음을 확인할 수 있다.


    즉, jQuery 소스 코드 전체가 즉시 실행 함수로 감싸져 있다.


    1
    2
    3
    (functiono( window, undefined) {
    ...
    })( window );
    cs


    이렇게 jQuery에서 즉시 실행 함수를 사용하는 이유는 자바스크립트의 변수 유효 범위 특성 때문이다.


    자바스크립트에서는 함수 유효 범위를 지원한다. 기본적으로 자바스크립트는 변수를 선언할 경우 프로그램 전체에서 접근할 수 있는 전역 유효 범위를 가지게 된다.


    그러나 Javascript 함수 내부에서 정의된 매개변수와 변수들은 함수 코드 내부에서만 유효할 뿐 함수 밖에서는 유효하지 않다. (여기서 변수들은 var 문을 사용해서 정의해야 한다. 그렇지 않으면 함수 내의 변수라도 전역 유효 범위를 갖게된다)

    이것은 달리 말하면 함수 외부의 코드에서 함수 내부의 변수를 엑세스하는 게 불가능하다는 것이다. 따라서 라이브러리 코드를 이렇게 즉시 실행 함수 내부에 정의해두게 되면, 라이브러리 내의 변수들은 함수 외부에서 접근할 수 없다.


    따라서 이렇게 즉시 실행 함수 내에 라이브러리 코드를 추가하면 전역 네임스페이스를 더럽히지 않으므로, 이후 다른 자바스크립트 라이브러리들이 동시에 로드가 되더라도 라이브러리 간 변수 이름 충돌 같은 문제를 방지할 수 있다.


    Javascript 즉시 실행 함수 패턴

    즉시 실행 함수 패턴은 이미 언급했듯이, 라이브러리 코드가 로드되면 실행되는 초기화 작업을 할 때 많이 사용된다. jQuery 외에도 대부분의 라이브러리가 이와 같은 방식이므로, 잘 이해해야 한다.


    자바스크립트 함수 javascript function[Javascirpt Function] Immediately-invoked function expression


    다음은 몇 가지 유명 라이브러리의 초기화 코드이다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [ Underscore 1.3.3 ]
     
    (function() {
        var root = this;
        var previousUnderscore = root._;
        ...
        var _ = function(obj) { return new wrapper(obj); };
        ...
        root['_'= _;
        ...
    }).call(this);
    cs


    Underscore 1.1.3은 call 함수를 this 인자와 함께 사용하였다.


    이렇게 넘긴 this가 Javascript 즉시 실행 함수 내부의 this에 바인딩된다. 물론 이것도 전역 객체이다. 함수 내부에서 root라는 이름으로 사용된다. 그리고 root에 '_'를 추가한다.


    underscore는 브라우저뿐만 아니라, node.js에서도 사용이 가능하게 설계되었다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [ Sugar 1.2 ]
     
    (function() {
        ...
        // Initialize
        buildObject();
        buildString();
        buildFunction();
        initializeClass(date);
    })();
    cs


    Suarg 1.2는 특별한 인자 없이 즉시 실행 함수를 호출한다.


    sugar에서 제공하는 대부분의 함수는 Object.prototype이나 Function.prototype 등 기존에 있는 객체에 들어가므로, 특별히 네임스페이스를 정의하지 않았다.


    이와 같이 라이브러리 코드가 처음 로드되어 초기화할 때, 즉시 실행 함수 패턴이 많이 사용됨을 기억하도록 하자.


    출처 : 인사이드 자바스크립트

    [자바스크립트 강좌 009] 즉시 실행 함수 사용 (Javascript Function)

    반응형