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

标签 javascript performance closures higher-order-functions

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

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

但是,这意味着每次我调用 outerFunction 时,都会声明并返回一个 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,但是数据不能很容易成为私有(private)的,并且该函数只能作为方法调用,因此它可以访问其上下文变量(这只是一个例子;还有其他方法可以解决这个问题;我的问题是不是 实际上是关于构造函数和原型(prototype))。

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

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

最佳答案

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

但是,原型(prototype)方法仍然可以更快,因为引擎更擅长检测内联方法调用的可能性。您将需要逐步了解 this article 中的详细信息- 虽然它很容易被更新的编译器优化过时。
但是不要害怕关闭,因此,对于您遇到的大多数情况,任何差异都可以忽略不计。如果有疑问,并且确实需要速度,请对代码进行基准测试(并在此之前避免过早优化)。如果闭包使您的代码更易于阅读、编写和维护,那就选择它们吧。它们是您不容错过的强大工具。

关于javascript - 出于性能原因,我应该避免多次执行相同的函数声明吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968666/

相关文章:

python - 在 pandas 字符串列中查找多个关键字的更有效方法

javascript - 将定时器 ID 放入其函数中

命名空间的 JavaScript 继承

javascript - AWS Amplify 入门教程中使用 JavaScript 的 Webpack 服务器无法工作

javascript - 如何基于 2 个直径点且没有长度或高度值的 d3.js 绘制矩形?

javascript - 解释Javascript代码,填充到字符串的左侧或右侧

c - gcc优化的解释

mysql - 加快 IP 查找的双重/嵌套选择查询

javascript - 调试显示模块模式 : functions not in scope until called?

Groovy 编译器不接受 java 8 Lambda