这个JavaScript模式叫什么?为什么使用它?

这个JavaScript模式叫什么?为什么使用它?,javascript,closures,iife,Javascript,Closures,Iife,我正在研究并注意到一种模式,其中函数的定义如下: var foo = ( function () { var bar = new Bar(); return function ( ) { //actual logic using bar from above. //return result; }; }()); (示例请参见光线投射方法) 这种方法的正常变化如下所示: var foo = function () { var ba

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

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;
};
var tmpObject = new Bar();

function foo(){
    // Use tmpObject.
}
将第一个版本与正常变化进行比较,第一个版本的不同之处在于:

  • 它分配自执行函数的结果
  • 它在这个函数中定义了一个局部变量
  • 它返回包含使用局部变量的逻辑的实际函数
  • 因此,主要的区别在于,在第一个变体中,在初始化时,该条只被指定一次,而第二个变体每次调用时都会创建这个临时变量

    我对为什么使用它的最佳猜测是,它限制了bar的实例数(只有一个),从而节省了内存管理开销

    我的问题是:

  • 这个假设正确吗
  • 这个图案有名字吗
  • 为什么要用这个

  • 它限制了对象初始化成本,并另外确保所有函数调用使用相同的对象。例如,这允许将状态存储在对象中以供将来调用使用

    虽然它可能会限制内存使用,但GC通常会以任何方式收集未使用的对象,因此这种模式不太可能有多大帮助


    此模式是的一种特定形式。

    它限制了对象初始化成本,并另外确保所有函数调用使用相同的对象。例如,这允许将状态存储在对象中以供将来调用使用

    虽然它可能会限制内存使用,但GC通常会以任何方式收集未使用的对象,因此这种模式不太可能有多大帮助


    此模式是的一种特定形式。

    我不确定此模式是否有更正确的名称,但在我看来它像一个模块,使用它的原因是封装和维护状态

    闭包(由函数中的函数标识)确保内部函数可以访问外部函数中的变量


    在您给出的示例中,通过执行外部函数返回内部函数(并将其分配给
    foo
    ),这意味着
    tmpObject
    继续存在于闭包中,并多次调用内部函数
    foo()
    将在
    tmpObject

    的同一个实例上运行,我不确定此模式是否有更正确的名称,但对我来说这看起来像一个模块,使用它的原因是封装和维护状态

    闭包(由函数中的函数标识)确保内部函数可以访问外部函数中的变量


    在您给出的示例中,通过执行外部函数返回内部函数(并将其分配给
    foo
    ),这意味着
    tmpObject
    继续存在于闭包中,并多次调用内部函数
    foo()
    将在
    tmpObject

    的同一实例上运行。您的假设几乎是正确的。让我们先回顾一下这些

  • 它分配自执行函数的返回
  • 这称为or

  • 它在这个函数中定义了一个局部变量
  • 这是在JavaScript中使用私有对象字段的方法,因为它不提供
    private
    关键字或其他功能

  • 它返回包含使用局部变量的逻辑的实际函数
  • 同样,主要的一点是这个局部变量是私有的

    这个图案有名字吗

    好吧,你可以称之为这种模式。引述:

    模块模式使用闭包封装“隐私”、状态和组织。它提供了一种包装公共和私有方法和变量的混合方式,防止片段泄漏到全局范围,并避免与其他开发人员的接口发生意外冲突。使用此模式,只返回一个公共API,将闭包中的所有其他内容保持为私有

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

  • 它正在实现单例设计模式
  • 使用第一个示例可以控制创建特定类型对象的方式。与这一点非常接近的匹配可以用有效的Java描述
  • 如果每次都需要相同的对象状态

  • 但是,如果您每次都需要普通对象,那么这种模式可能不会增加任何价值。

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

  • 它分配自执行函数的返回
  • 这称为or

  • 它在这个函数中定义了一个局部变量
  • 这是在JavaScript中使用私有对象字段的方法,因为它不提供
    private
    关键字或其他功能

  • 它返回包含使用局部变量的逻辑的实际函数
  • 同样,主要的一点是这个局部变量是私有的

    这个图案有名字吗

    好吧,你可以称之为这种模式。引述:

    模块模式使用闭包封装“隐私”、状态和组织。它提供了一种包装公共和私有方法和变量的混合方式,防止片段泄漏到全局范围,并避免与其他开发人员的接口发生意外冲突。使用此模式,只返回一个公共API,将闭包中的所有其他内容保持为私有

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

  • 它正在实现单例设计模式
  • 可以使用fi控制创建特定类型对象的方式
    var tmpObject = new Bar();
    
    module.exports = function foo(){
        // Use tmpObject.
    };
    
    var foo = require('./foo');