当前位置: 首页 > 面试题库 >

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

丁震博
2023-03-14
问题内容

我正在研究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. 为什么要使用它?

问题答案:

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

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

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

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

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

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

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

此模式有名称吗?

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

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

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

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

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



 类似资料:
  • 我不喜欢这个模式的地方,就像我添加的链接的评论中提到的那样,一个topping不是一个pizza,所以为什么它要继承pizza类呢? 我心目中的解决方案是在对象中使用对象数组,并使用该数组添加或删除披萨的浇头。 这种解决方案不是比使用decorator模式简单得多吗?为什么我们要考虑在这种情况下使用decorator模式呢?

  • 问题内容: 由于JavaScript不是从Java派生的,为什么它的名称中带有“ Java”? 问题答案: JavaScript最初名为Mocha,后来又重命名为LiveScript,然后又重命名为JavaScript。 将LiveScript更改为JavaScript的名称是因为Netscape和Sun达成了许可协议。 然后将该语言提交给ECMA国际组织进行标准化处理。到那时,Netscape不

  • 问题内容: 我正在做一个小的javascript方法,该方法会接收到一个点列表,并且我必须阅读这些点才能在Google地图中创建多边形。 我在表格上收到这些要点: (lat,long),(lat,long),(lat,long) 因此,我完成了以下正则表达式: 我已经使用RegexPal和收到的确切数据进行了测试: 并且它可以正常工作,所以为什么当我在JavaScript中添加此代码后,结果中会收

  • 问题内容: 我经常在PHP中看到包含include.inc文件的示例。.inc是什么意思?它的作用是什么?使用它的缺点和优点是什么? 问题答案: 它没有任何意义,只是一个文件扩展名。如果扩展名是.inc的文件被设计为包含在其他PHP文件中,这是某些人的惯例,但这只是惯例。 它确实存在一个可能的缺点,即通常没有将服务器配置为将.inc文件解析为php,因此,如果该文件位于您的Web根目录中,并且您的

  • 问题内容: 问候语,当前正在开发小型Web服务应用程序,其中来自Web服务(使用CXF + Spring)的响应已处理并保存到数据库中。为了使用数据库,我正在使用Hibernate(3.5)。在网络上浏览一些Hibernate + Spring示例,我经常可以看到HibernateTemplate的用法,因此我对此感到有些困惑,想问一下: 您是否在Hibernate3应用程序中使用Hibernat

  • 问题内容: 我了解JSON,但不了解JSONP。Wikipedia上有关JSON的文档是JSONP的最高搜索结果。它说: JSONP或“带填充的JSON”是JSON扩展,其中将前缀指定为调用本身的输入参数。 ??什么电话 这对我来说毫无意义。JSON是一种数据格式。没有电话 在第二个搜索结果是由某些人叫雷米,谁写的这个约JSONP: JSONP是脚本标记注入,它将响应从服务器传递到用户指定的函数。