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