gpt4 book ai didi

javascript - 关闭的合理用途?

转载 作者:行者123 更新时间:2023-11-30 06:32:37 25 4
gpt4 key购买 nike

最近,我一直在我的公司中看到生产代码返回带有闭包函数。比如 return (function() {...}()); 而且我不喜欢看到这个,但我不是权威人士。我想我会问 StackOverflow 为什么以及何时使用这个好/不好。

* 注意 *

假设您不担心 namespace 污染,因为所有这些函数都已经在它们的闭包中。

示例 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 .我认为这使我的观察不会太远。

最佳答案

我认为不可能为每个简单案例在示例 a、b 和 c 之间选择一个明显的赢家。

在您给出的示例中,版本 (c) 已经足够好了,所以我会使用它。也就是说,版本 (a) 将 i、len 和结果变量保持在更严格的范围内,因此如果您想将“x”和“y”与持续时间“b”分开,这绝对是一个很好的方法。

我不喜欢仅仅出于组织或范围界定的原因将事物拆分为单独的命名函数,就像您在示例 (b) 中所做的那样,因为它往往会使代码更复杂且更难理解。但是,如果 barProccess 是一个实际可重用的抽象,您可以为其指定一个明确的名称,那么将其分开可能是个好主意。

Say your not concerned about namespace pollution because all of these functions are already in their on closure.

我觉得你有点夸张了。内部 IFFE 不像外部 IFFE 那样是 100% 推荐的,但进一步限制范围仍然是完全可以的,我认为不值得为此与你的同事争吵。

关于javascript - 关闭的合理用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com