javascript - 关闭的合理用途?

标签 javascript closures

最近,我一直在我的公司中看到生产代码返回带有闭包函数。比如 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/

相关文章:

javascript - CSP - 如何解决 style-src unsafe-inline - 当具有动态定位的页面元素时

javascript - 这两种声明原型(prototype)方法的方式有什么区别?

python - 使用 lambda 表达式进行字典理解无法产生所需的结果

Groovy .each 闭包将元素包装在不需要的 Object[] 中

Javascript 函数工厂嵌套在 jQuery 就绪函数中嵌套的立即函数中

javascript - jQuery 只需要根据其他字段中的值自动填充一个输入字段(行)(自动完成);所有其他字段必须保持不变

javascript - 为什么脚本不起作用?

javascript - onClick后如何不刷新页面

javascript - 在添加 ApiController 属性之前,ASP.NET Core 3.1 无法处理 Axios 请求

ios - Swift 5 闭包解释