为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

四季花海 2019-09-20 15:20:00
我正在研究THREE.js并注意到一个模式,其中函数的定义如下:var foo = ( function () {    var bar = new Bar();    return function ( ) {        //actual logic using bar from above.        //return result;    };}());(示例请参见此处的 raycast方法)。这种方法的正常变化如下所示:var foo = function () {    var bar = new Bar();    //actual logic.    //return result;};将第一个版本与正常变体进行比较,第一个版本似乎有不同之处:它分配自执行功能的结果。它在此函数中定义了一个局部变量。它返回包含使用局部变量的逻辑的实际函数。因此,主要区别在于,在第一个变体中,条形图在初始化时仅分配一次,而第二个变体在每次调用时都创建此临时变量。我最好猜测为什么使用它是为了限制bar的实例数(只有一个),从而节省了内存管理开销。我的问题:这个假设是否正确?这个模式有名字吗?这是为什么用的?
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

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


它分配自执行功能的返回

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


它在此函数中定义了一个局部变量

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


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

同样,重点是这个局部变量是私有的。


这个模式有名字吗?


AFAIK你可以称之为模式模式。引用:


Module模式使用闭包封装了“隐私”,状态和组织。它提供了一种包装公共和私有方法和变量的方法,保护组件不会泄漏到全局范围,并意外地与另一个开发人员的界面发生冲突。使用此模式,只返回一个公共API,保持闭包内的其他所有内容。


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


它正在实施Singleton设计模式。

可以使用第一个示例控制可以创建特定类型的对象的方式。与此点紧密匹配的可以是Effective Java中描述的静态工厂方法。

这是有效的,如果你需要在同一个对象的状态每次。

但是如果你每次只需要vanilla对象,那么这个模式可能不会添加任何值。


查看完整回答
反对 回复 2019-09-20
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我不确定这个模式是否有更正确的名称,但这对我来说看起来像一个模块,它的用途是封装和维护状态。


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


在您给出的示例中,foo通过执行外部函数返回(并分配给)内部函数,这意味着tmpObject在闭包内继续存在,并且对内部函数的多个调用foo()将在相同的实例上运行tmpObject。


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 308 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信