一尘不染

此JavaScript模式称为什么,为什么使用它?

javascript

我正在研究THREE.js,并注意到其中定义函数的模式如下:

var foo = ( function () {
    var bar = new Bar();

    return function ( ) {
        //actual logic using bar from above.
        //return result;
    };
}());

这种方法的 正常 变化如下所示:

var foo = function () {
    var bar = new Bar();

    //actual logic.
    //return result;
};

将第一个版本与 正常 版本进行比较,第一个版本似乎有所不同:

  1. 它分配一个自动执行功能的结果。
  2. 它在此函数内定义了局部变量。
  3. 它返回包含使用局部变量的逻辑的 实际 函数。

因此,主要的区别在于,在第一个变体中,初始化时,bar仅分配一次,而第二个变体在每次调用时都会创建此临时变量。

关于为什么使用此方法的最好猜测是,它限制了bar的实例数量(只有一个),从而节省了内存管理开销。

我的问题:

  1. 这个假设正确吗?
  2. 此模式有名称吗?
  3. 为什么要使用它?

阅读 289

收藏
2020-05-01

共1个答案

一尘不染

您的假设几乎是正确的。让我们先回顾一下。

  1. 它分配一个自执行函数的返回

这称为立即调用函数表达式或IIFE

  1. 它在此函数内定义了局部变量

这是在JavaScript中拥有私有对象字段的方式,因为它不提供private关键字或功能。

  1. 它返回包含使用局部变量的逻辑的实际函数。

同样,要点是该局部变量是 private

此模式有名称吗?

可以将这种模式称为“模块模式”。报价单:

模块模式使用闭包封装“隐私”,状态和组织。它提供了一种包装公共和私有方法与变量的组合的方法,可以防止碎片泄漏到全局范围内以及意外地与其他开发人员的界面冲突。使用此模式,仅返回公共API,将闭包中的所有其他内容保持私有。

比较这两个示例,我对为什么使用第一个示例的最佳猜测是:

  1. 它正在实现Singleton设计模式。
  2. 使用第一个示例,可以控制创建特定类型的对象的方式。与这一点最接近的可以是有效Java中所述的静态工厂方法。
  3. 如果每次都需要相同的对象状态,这将非常有效。

但是,如果您每次只需要香草对象,那么此模式可能不会增加任何值。

2020-05-01