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/