【问题标题】:Javascript: Self invoking singleton function vs creating instances of the function?Javascript:自调用单例函数与创建函数实例?
【发布时间】:2018-01-21 13:31:40
【问题描述】:

在javascript中揭示模块化模式哪个更好:

  1. 拥有一个自调用函数,该函数将在 JS 渲染时只初始化一次,如下所示:

<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>
- - 要么 - - -
  1. 有一个构造函数来执行此操作:

<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 中我们会在内存中有多个函数副本,因为内存应该分配给变量而不是函数。

这两种方法中哪一种是正确的?如何决定何时选择哪一种?

【问题讨论】:

  • 第一个模式相当于单例模式。如果您想共享一些资源,您可以使用模块化模式来创建单个实例并让每个人都使用该实例。例如数据库连接
  • @marvel308:内存分配呢?如何为这两者分配内存?
  • 我建议通过developer.mozilla.org/en-US/docs/Web/JavaScript/…。并阅读 new 关键字如何分配内存和垃圾回收

标签: javascript revealing-module-pattern


【解决方案1】:

3) 一个简单的 js 对象? :

var calculator = {
  add(a,b){
   return a+b;
  }
};

alert(calculator.add(1,2))

由于您既不想要多个实例(第二种方法适用)并且您没有私有变量(闭包适用),所以上层可能是要走的路。

【讨论】:

  • 我把情况简单化了。我只需要在这个对象中公开几个函数,所以需要返回。我将编辑问题。
  • 我只是想了解内存分配在 1,2 或 3 中是如何工作的,以便我可以在需要时选择它们
  • @maverick well 2 实际上不是构造函数,而是工厂。
  • @maverick 您无法比较它们,因为它们是针对不同的问题而设计的。比较它们没有意义
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2016-08-27
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多