【发布时间】:2013-05-17 22:14:56
【问题描述】:
最近,我在公司的生产代码中看到了带有闭包函数的返回。如return (function() {...}()); 和我不喜欢看到这个,但我不是权威来源。我想我会问 StackOverflow 为什么以及何时使用这个好/坏。
* 注意 *
说你不关心命名空间污染,因为所有这些函数都已经关闭了。
示例 1a:
function foo(bar) {
return {
x: 1 + bar,
y: 1 - bar,
duration: (function() {
var i = 0,
len = 5;
var results = 0;
for (; i < bar; i++) {
results += 1 + (results * bar);
}
return results;
}())
};
}
示例 1b:
function barProcess(bar) {
var i = 0;
var len = 5;
var results = 0;
for (; i < bar; i++) {
results += 1 + (results * bar);
}
return results;
}
function foo(bar) {
return {
x: 1 + bar,
y: 1 - bar,
duration: barProcess(bar)
};
}
示例 1c:
function foo(bar) {
var i = 0;
var len = 5;
var results = 0;
for (; i < bar; i++) {
results += 1 + (results * bar);
}
return {
x: 1 + bar,
y: 1 - bar,
duration: results
};
}
观察:
示例 1a:
如果需要,内部函数会利用闭包。
示例 1b:
如果barProcess 可能需要一些闭包,这可能会使参数列表变长并且难以维护。
示例 1c:
每次调用没有额外的函数创建。
它最容易调试(在我看来)。
如果有人能给我一些技术原因,说明为什么应该使用示例 a、b 或 c,那就太好了。
所以,我蹩脚的答案并没有让我满意,所以我尝试了这个。 JS Perf Tests。我认为这让我的观察不会太远。
【问题讨论】:
-
这个更适合Programmers。
-
在我看来,当你需要保持某个东西的值不变时,你会使用闭包,比如在循环中,否则大多数时候不需要它们。当调用外部函数等没有实际意义时,自执行函数会很方便?
-
额外说明:当特征检测一个native函数时,只需要决定一次,而不是每次执行,是否可以使用该native函数还是需要使用shim/alternative函数。
-
Example1a确实在每次执行时都会在内存中创建一个新函数,这似乎很愚蠢。既然值已经在函数本身中被关闭了,为什么还要做第二个函数呢?
标签: javascript closures