我正在研究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;
};
将第一个版本与 正常 版本进行比较,第一个版本似乎有所不同:
因此,主要的区别在于,在第一个变体中,初始化时,bar仅分配一次,而第二个变体在每次调用时都会创建此临时变量。
关于为什么使用此方法的最好猜测是,它限制了bar的实例数量(只有一个),从而节省了内存管理开销。
我的问题:
您的假设几乎是正确的。让我们先回顾一下。
- 它分配一个自执行函数的返回
这称为立即调用函数表达式或IIFE
- 它在此函数内定义了局部变量
这是在JavaScript中拥有私有对象字段的方式,因为它不提供private
关键字或功能。
- 它返回包含使用局部变量的逻辑的实际函数。
同样,要点是该局部变量是 private 。
此模式有名称吗?
可以将这种模式称为“模块模式”。报价单:
模块模式使用闭包封装“隐私”,状态和组织。它提供了一种包装公共和私有方法与变量的组合的方法,可以防止碎片泄漏到全局范围内以及意外地与其他开发人员的界面冲突。使用此模式,仅返回公共API,将闭包中的所有其他内容保持私有。
比较这两个示例,我对为什么使用第一个示例的最佳猜测是:
但是,如果您每次只需要香草对象,那么此模式可能不会增加任何值。
我不喜欢这个模式的地方,就像我添加的链接的评论中提到的那样,一个topping不是一个pizza,所以为什么它要继承pizza类呢? 我心目中的解决方案是在对象中使用对象数组,并使用该数组添加或删除披萨的浇头。 这种解决方案不是比使用decorator模式简单得多吗?为什么我们要考虑在这种情况下使用decorator模式呢?
问题内容: 我正在做一个小的javascript方法,该方法会接收到一个点列表,并且我必须阅读这些点才能在Google地图中创建多边形。 我在表格上收到这些要点: (lat,long),(lat,long),(lat,long) 因此,我完成了以下正则表达式: 我已经使用RegexPal和收到的确切数据进行了测试: 并且它可以正常工作,所以为什么当我在JavaScript中添加此代码后,结果中会收
问题内容: 由于JavaScript不是从Java派生的,为什么它的名称中带有“ Java”? 问题答案: JavaScript最初名为Mocha,后来又重命名为LiveScript,然后又重命名为JavaScript。 将LiveScript更改为JavaScript的名称是因为Netscape和Sun达成了许可协议。 然后将该语言提交给ECMA国际组织进行标准化处理。到那时,Netscape不
问题内容: 我经常在PHP中看到包含include.inc文件的示例。.inc是什么意思?它的作用是什么?使用它的缺点和优点是什么? 问题答案: 它没有任何意义,只是一个文件扩展名。如果扩展名是.inc的文件被设计为包含在其他PHP文件中,这是某些人的惯例,但这只是惯例。 它确实存在一个可能的缺点,即通常没有将服务器配置为将.inc文件解析为php,因此,如果该文件位于您的Web根目录中,并且您的
问题内容: 问候语,当前正在开发小型Web服务应用程序,其中来自Web服务(使用CXF + Spring)的响应已处理并保存到数据库中。为了使用数据库,我正在使用Hibernate(3.5)。在网络上浏览一些Hibernate + Spring示例,我经常可以看到HibernateTemplate的用法,因此我对此感到有些困惑,想问一下: 您是否在Hibernate3应用程序中使用Hibernat
问题内容: 最近有人要求我为一堂课学习一些MATLAB基础知识。 是什么让它对研究人员和大学工作人员来说如此酷?我发现处理矩阵和绘制事物很酷……(可以使用某些库在Python中轻松完成的事情)。 编写函数或解析文件很痛苦。我仍处于起步阶段,我想念什么? 在“现实”世界中,我应该考虑将其用于什么?什么时候可以比Python做得更好?为了更好,我的意思是:写表演的简便方法。 更新1: 我最想知道的一件