【发布时间】:2014-11-23 09:15:23
【问题描述】:
我正在研究 THREE.js 并注意到函数定义如下的模式:
var foo = ( function () {
var bar = new Bar();
return function ( ) {
//actual logic using bar from above.
//return result;
};
}());
(示例见光线投射方法here)。
这种方法的正常变体如下所示:
var foo = function () {
var bar = new Bar();
//actual logic.
//return result;
};
将第一个版本与正常变体进行比较,第一个版本似乎不同:
- 它分配自执行函数的结果。
- 它在这个函数中定义了一个局部变量。
- 它返回实际函数,其中包含使用局部变量的逻辑。
因此主要区别在于,在第一个变体中,bar 在初始化时只分配一次,而第二个变体在每次调用时都会创建这个临时变量。
我对为什么使用它的最佳猜测是它限制了 bar 的实例数量(只有一个),从而节省了内存管理开销。
我的问题:
- 这个假设正确吗?
- 这种模式有名称吗?
- 为什么要使用这个?
【问题讨论】:
-
@ChrisHayes 很公平。我将其标记为 THREE.js,因为我认为 THREE.js 贡献者最有资格回答这个问题,但是是的,这是一个通用的 JS 问题。
-
我相信它被称为闭包。你可以阅读它们。
-
如果这是唯一实例化 Bar 的地方,那么它就是 singleton 模式。
-
不一定是为了节省内存,但可以跨调用保持状态
-
@wrongAnswer:不完全是。这里匿名函数(将是闭包)立即执行。
标签: javascript closures iife