最近,我在公司中看到带有闭包函数的生产代码返回。例如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)
};
}
Example1c:
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
可能需要关闭,这可能会使参数列表过长且难以维护。Example1c:
每次调用没有额外的功能创建。
调试(在我看来)最简单。
如果有人可以给我一些技术原因,那么为什么应该使用示例a,b或c,这太棒了。
因此,我的la脚回答使我不满意,因此我尝试了此操作。 JS Perf Tests。我认为这使我的观察距离不太远。
最佳答案
我认为不可能在每个简单案例的示例a,b和c之间选择一个明确的赢家。
在您提供的示例中,版本(c)足够好,因此我会继续使用它。就是说,版本(a)将i,len和result变量保持在更紧密的范围内,因此,如果要将“ x”和“ y”与持续时间“ b”更分开,这绝对是一个好方法。
我不喜欢像组织示例(b)那样仅出于组织或作用域原因而将事情分为单独的命名函数,因为这样做会使代码更复杂且更难于遵循。但是,如果barProccess是实际的可重用抽象,您可以给它起一个清晰的名称,然后将其分开可能是个好主意。
说您不关心名称空间污染,因为所有这些功能都已关闭。
我认为您在这里有点不高兴。不建议内部IFFE像外部IFFE一样100%推荐,但是对范围的进一步限制仍然是完全可以的,而且我认为不值得与您的同事为此而战。