出于性能原因,我应该避免多次执行相同的函数声明吗?
Should I avoid executing the same function declaration multiple times for performance reasons?
Javascript 的一个强大功能是如何使用闭包和高阶函数来隐藏私有数据:
function outerFunction(closureArgument) {
var closureVariable = something;
return function innerFunction() {
// do something with the closed variables
}
}
但是,这意味着我每次调用outerFunction
,都会声明并返回一个newinnerFunction
,也就是说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 引擎应该能够优化上面的代码示例,这样就不会有太大的性能影响,因为我们有"multiple" 个函数,而不是单个共享函数。
总结: 运行 多次声明相同的函数是否会带来任何显着的性能损失,或者 Javascript 引擎是否对其进行了优化?
是的,引擎确实优化了闭包。很多。没有 显着 性能或内存损失。
但是,原型方法仍然可以更快,因为引擎更善于检测内联方法调用的可能性。您将需要逐步了解 this article 中的详细信息 - 尽管更新的编译器优化很容易使它过时。
但是不要害怕闭包,因此,对于您遇到的大多数情况,任何差异都可以忽略不计。如果有疑问,并且确实需要速度,请对代码进行基准测试(并在此之前避免过早优化)。如果闭包使您的代码更易于阅读、编写和维护,那就选择它们吧。它们是您不容错过的强大工具。
Javascript 的一个强大功能是如何使用闭包和高阶函数来隐藏私有数据:
function outerFunction(closureArgument) {
var closureVariable = something;
return function innerFunction() {
// do something with the closed variables
}
}
但是,这意味着我每次调用outerFunction
,都会声明并返回一个newinnerFunction
,也就是说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 引擎应该能够优化上面的代码示例,这样就不会有太大的性能影响,因为我们有"multiple" 个函数,而不是单个共享函数。
总结: 运行 多次声明相同的函数是否会带来任何显着的性能损失,或者 Javascript 引擎是否对其进行了优化?
是的,引擎确实优化了闭包。很多。没有 显着 性能或内存损失。
但是,原型方法仍然可以更快,因为引擎更善于检测内联方法调用的可能性。您将需要逐步了解 this article 中的详细信息 - 尽管更新的编译器优化很容易使它过时。
但是不要害怕闭包,因此,对于您遇到的大多数情况,任何差异都可以忽略不计。如果有疑问,并且确实需要速度,请对代码进行基准测试(并在此之前避免过早优化)。如果闭包使您的代码更易于阅读、编写和维护,那就选择它们吧。它们是您不容错过的强大工具。