Pat*_*lug 100 javascript closures iife
我正在研究THREE.js并注意到一个模式,其中函数的定义如下:
var foo = ( function () {
var bar = new Bar();
return function ( ) {
//actual logic using bar from above.
//return result;
};
}());
Run Code Online (Sandbox Code Playgroud)
(示例请参见此处的 raycast方法).
这种方法的正常变化如下所示:
var foo = function () {
var bar = new Bar();
//actual logic.
//return result;
};
Run Code Online (Sandbox Code Playgroud)
将第一个版本与正常变体进行比较,第一个版本似乎有不同之处:
因此,主要区别在于,在第一个变体中,条形图在初始化时仅分配一次,而第二个变体在每次调用时都创建此临时变量.
我最好猜测为什么使用它是为了限制bar的实例数(只有一个),从而节省了内存管理开销.
我的问题:
MD.*_*oob 100
你的假设几乎是正确的.我们先来回顾一下.
- 它分配自执行功能的返回
这称为立即调用的函数表达式或IIFE
- 它在此函数中定义了一个局部变量
这是在JavaScript中使用私有对象字段的方式,因为它不提供private关键字或功能.
- 它返回包含使用局部变量的逻辑的实际函数.
同样,重点是这个局部变量是私有的.
这个模式有名字吗?
AFAIK你可以称之为模式模式.引用:
Module模式使用闭包封装了"隐私",状态和组织.它提供了一种包装公共和私有方法和变量的方法,保护组件不会泄漏到全局范围,并意外地与另一个开发人员的界面发生冲突.使用此模式,只返回一个公共API,保持闭包内的其他所有内容.
比较这两个例子,我最好的猜测是为什么第一个使用的是:
但是如果你每次只需要vanilla对象,那么这个模式可能不会添加任何值.
Fen*_*ang 11
它限制了对象初始化成本,并且还确保所有函数调用都使用相同的对象.例如,这允许将状态存储在对象中以供将来调用使用.
虽然它可能会限制内存使用,但通常GC会收集未使用的对象,因此这种模式可能不会有太大帮助.
这种模式是一种特定的封闭形式.
我不确定这个模式是否有更正确的名称,但这对我来说看起来像一个模块,它的用途是封装和维护状态.
闭包(由函数中的函数标识)确保内部函数可以访问外部函数中的变量.
在您给出的示例中,foo通过执行外部函数返回(并分配给)内部函数,这意味着tmpObject在闭包内继续存在,并且对内部函数的多个调用foo()将在相同的实例上运行tmpObject.
代码和Three.js代码之间的关键区别在于,在Three.js代码中,变量tmpObject只初始化一次,然后在返回函数的每次调用时共享.
这对于在调用之间保持一些状态很有用,类似于static在类C语言中使用变量的方式.
tmpObject 是一个只对内部函数可见的私有变量.
它改变了内存使用量,但它不是为了节省内存而设计的.
我想通过扩展到揭示模块模式的概念来为这个有趣的线程做出贡献,这确保所有方法和变量在显式公开之前都保持私有。
在后一种情况下,加法方法将被称为 Calculator.add();
| 归档时间: |
|
| 查看次数: |
6946 次 |
| 最近记录: |