2017-08-13 156 views
1

哪一個是更好地在JavaScript中透出模塊化模式來實現:Javascript:自調用單例函數vs創建函數的實例?

  1. 有自調用函數,這將在JS被渲染的時間內得到intialized只有一次,就像這樣:

<div id="output"> 
 
</div> 
 

 
<script> 
 
    var calculator = function() 
 
{ 
 
     add = function(x,y){ 
 
      return x+y; 
 
     };   
 
     return { add:add }; 
 
}(); 
 

 
document.getElementById("output").innerHTML = calculator.add(5,3);; 
 

 

 
</script>
---- ----- OR

  • 有一個構造做此類似:
  • <div id="output"> 
     
    </div> 
     
    
     
    <script> 
     
        var calculator = function() 
     
        { 
     
         add = function(x,y){ 
     
          return x+y; 
     
          }; 
     
          return { add:add }; 
     
        }; 
     
        document.getElementById("output").innerHTML = new calculator().add(5,3); 
     
    </script>

    在1日,好處我讀的是每個函數只會被初始化一次,而在2日,我們將有一個功能副本初始化每個對象。

    但是,第一個問題是,它會做一些工作,使JS加載時間內的單一副本。

    我很困惑爲什麼我們在case2的內存中有多個函數副本,因爲內存應該分配給變量而不是函數。

    以下哪兩種方法是正確的以及如何決定在何時選擇?

    +0

    第一個模式相當於單例模式。如果您想分享一些資源,您可以使用模塊化模式創建單個實例,並讓每個人都使用該實例。例如數據庫連接 – marvel308

    +0

    @ marvel308:內存分配情況如何?內存如何分配給這兩個? – maverick

    +0

    我建議通過https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management。並閱讀新關鍵字如何分配內存和垃圾回收 – marvel308

    回答

    0

    3)一個簡單的js對象? :

    var calculator = { 
        add(a,b){ 
        return a+b; 
        } 
    }; 
    
    alert(calculator.add(1,2)) 
    

    正如你既不想多個實例(其中,第二種方法是好的)和你將沒有私有變量(一個封閉的好),上可能是要走的路。

    +0

    我已經過分簡化了情況..我只需要在此對象中只公開幾個功能,所以返回將需要。我將編輯該問題。 – maverick

    +0

    我只想了解內存分配如何在1,2或3中工作,以便我可以在需要時選擇這些內存 – maverick

    +0

    @maverick well 2實際上不是構造函數,而是工廠。 –