【发布时间】:2013-05-20 07:29:29
【问题描述】:
在 javascript 中调用方法的性能执行和执行时间一致性之间的最佳折衷是什么?
我仍在学习 javascript,并且会在大多数情况下使用原型(即 Brendan Eich here),但我认为我从函数闭包中找到了更好的性能和一致性(我知道我可能过度优化了)。我一直在测试的一种原型模式:
function PrototypeA() {}
PrototypeA.prototype.a = 0;
PrototypeA.prototype.b = 0;
PrototypeA.prototype.someMath = function() {
this.a += 1;
this.b += 2;
};
var Test = new PrototypeA();
Test.someMath();
在阅读此(太棒了!)post 后决定对闭包进行基准测试。我目前的关闭模式:
var SubModule = new((function() {
var a = 0;
var b = 0;
var someMath = function() {
a += 1;
b += 2;
};
return function() {
this.someMath = someMath
};
})())();
我发现由于测试设置中的错误(例如在基准测试中调用构造函数或以导致不同范围遍历路径的方式调用方法)导致各种模式的许多基准测试具有误导性。我只是想测试方法的执行。
经过大量本地基准测试(benchmark.js 跨越许多不同的模式),我提出了值得注意的模式:
我的发现似乎支持组织良好的闭包不会像其他类型的对象那样在执行时间上发生偏差(我松散地使用术语“类型”)。我意识到由于基准或设置上的任何数字或错误,我可能完全错了。
感谢收看!
【问题讨论】:
-
闭包和原型是完全不同的动物。很难想象您会想要或需要在它们之间做出选择的情况。
-
而
var x = new((function() {...})())();是一个可怕的结构。 -
动画是我的用例。 SubModule 结构很丑陋。它试图避免对象文字和额外的代码行。
-
new是不必要的。尝试简化为var x = (function() {...})();。 -
如果不创建对象,我不会得到闭包。有没有其他方法可以在没有 new 的情况下从该构造函数创建闭包?
标签: javascript performance closures