2017-03-13 75 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 invocations(其中printerInstance等於null)。所以這更像是Singleton

在第二種情況下,getInstance的每個調用都將擁有自己的計數器並獨立計數。

相關問題