2017-03-13 18 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; 
     } 
    }; 
})(); 

は、私は理解していない:誰かが下の2つのスニペットの違いは何であるかを教えてもらえます。どうか明らかにしてください。

+1

両方の例では、インスタント関数アプリケーションは新しいスコープを作成して、 'printerInstance'、' obj'および 'create'が周囲のスコープに漏れないようにしています。 – Sylwester

答えて

1

最初のコールにはすべてobjという1つのオブジェクトがあり、2番目のコールはすべてのコールに対して新しいコールを作成します。

したがって、例えば、それがあることを言う:

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 
    } 
} 

、全てで参照される1 counterを持つ一つの目的がありますgetInstance呼び出し(printerInstancenullとなります)。これは、Singletonのようなものです。

2番目のケースでは、getInstanceを呼び出すたびに、独自のカウンタがあり、独立してカウントされます。

関連する問題