出于性能原因,我应该避免多次执行相同的函数声明吗?

时间:2016-01-23 20:46:31

标签: javascript performance closures higher-order-functions

Javascript的一个强大功能是如何使用闭包和高阶函数来隐藏私有数据:

function outerFunction(closureArgument) {
    var closureVariable = something;
    return function innerFunction() {
        // do something with the closed variables
    }
}

但是,这意味着每次拨打outerFunction时,都会声明并返回 new innerFunction,这意味着outerFunction(arg) !== outerFunction(arg)。我想知道这可能在多大程度上影响性能。例如,一个典型的替代方法是创建一个包含数据的构造函数,并将innerFunction放在prototype上:

function Constructor(argument) {
    this.argument = argument;
    this.variable = something;
}

Constructor.prototype.method = function() {
    // do something with this.argument and this.variable
}

在这种情况下,有一个函数由多个实例共享,例如new Constructor().method === new Constructor().method,但数据不能轻易地变为私有,并且该函数只能作为方法调用,所以它可以访问它的上下文变量(这只是一个例子;还有其他方法可以解决这个问题;我的问题是 实际上是关于构造函数和原型的。)

从性能角度来看这是否重要?在我看来,由于函数总是一个文字,而函数体本身是不可变的,Javascript引擎应该能够优化上面的代码示例,这样就不会有很大的性能影响,因为我们有“多个”函数而不是单一的共享功能。

总结:多次运行相同的函数声明会带来任何显着的性能损失,还是Javascript引擎会对其进行优化?

1 个答案:

答案 0 :(得分:2)

是的,引擎会优化闭包。很多。没有显着的性能或内存损失。

然而,原型方法仍然可以更快,因为引擎更好地检测内联方法调用的可能性。您需要逐步了解this article中的详细信息 - 尽管新的编译器优化很容易使其过时。
但是,不要担心关闭因此,对于您遇到的大多数情况,任何差异都可以忽略不计。如果有疑问,并且真正需要速度,请对代码进行基准测试(并避免过早优化)。如果闭包使您的代码更容易阅读,编写,维护,那就去做吧。它们是您不想错过的强大工具。