最近,我在公司中看到带有闭包函数的生产代码返回。例如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%推荐,但是对范围的进一步限制仍然是完全可以的,而且我认为不值得与您的同事为此而战。

10-06 03:53