2017-03-13 3 views
0

나는 스 니펫을 발견 했으므로 직설적 인 방법으로 쓰여질 수 있을지 의심 스럽다. 객체가 두 번째 예에서는 함수 내에서 생성 된 이유함수의 개인 함수에 대한 참조로 객체 만들기

var printer = (function() { 
    var printerInstance; 
    var obj = { 
    f1: function() {}, 
    f2: function() {} 
    }; 
    return { 
    getInstance: function() { 
     if(!printerInstance) { 
     printerInstance = obj; 
     } 
     return printerInstance; 
    } 
    }; 
})(); 

그리고

var printer = (function() { 
    var printerInstance; 
    function create() { 
     function f1() {} 
     function f2() {} 
     return { 
      f1: f1, 
      f2: f2 
     } 
    } 

    return { 
     getInstance: function() { 
     if(!printerInstance) { 
      printerInstance = create(); 
     } 
     return printerInstance; 
     } 
    }; 
})(); 

내가 이해하지 않았다 : 누군가가 아래 두 조각 사이의 차이가 무엇인지 말해 주 시겠어요. 명확히하십시오.

+1

두 예제 모두 인스턴트 함수 어플리케이션은 새로운 범위를 생성하여 'printerInstance','obj' 및'create'가 주변 범위로 유출되지 않도록합니다. – Sylwester

답변

1

음, 첫 번째 개체에는 모든 호출에 대해 obj이라는 개체가 있고 두 번째 개체는 모든 호출에 대해 새 개체를 만듭니다.

그래서, 예를 들어 그것이라고 :

var obj = { 
    var counter = 0; 
    f1: function() { return counter++; }, 
    f2: function() {} 
}; 

하고 두번째는 : 첫 번째 경우

function create() { 
    var counter = 0; 
    function f1() { return counter++; } 
    function f2() {} 
    return { 
    f1: f1, 
    f2: f2 
    } 
} 

모두 참조 할 것 하나 counter 한 개체가 getInstance 호출 (여기서 printerInstancenull과 같습니다). 따라서 이것은 Singleton과 같습니다.

두 번째 경우에는 getInstance을 호출 할 때마다 자체 카운터가 있고 독립적으로 카운트됩니다.