在最新的 safari (5.1.7) 和移动 safari 中,通过闭包访问对象时,命名函数和匿名函数之间存在巨大的性能差异。请参阅http://jsperf.com/nfe-fe/2
这在早期版本的 safari 中不是问题,但在更高版本中似乎是一个问题。
有什么方法可以提高命名函数表达式的性能?我喜欢命名函数有两个原因 - 易于查看堆栈跟踪并使用 .name 属性获得更好的日志。最新的 safari 中的 bug 严重降低了我们应用程序的性能。
我在下面给出了 jsperf 中使用的测试代码:
准备代码
Benchmark.prototype.setup = function() {
var FunctionExpressionCreator = function () {
var i = 0;
this.a = function () {
return ++i;
}
this.test = function () {
for (var i = 0; i < 100; ++i) {
this.a();
}
}
};
var functionExprObject = new FunctionExpressionCreator();
var NamedFunctionExpressionCreator = function () {
var i = 0;
this.a = function a() {
return ++i;
}
this.test = function test() {
for (var i = 0; i < 100; ++i) {
this.a();
}
}
};
var namedFunctionExprObject = new NamedFunctionExpressionCreator();
};
测试1:命名函数ExprObject.test();
测试2:函数ExprObject.test();
在最近的 iOS 和 Safari 5.1.7 上,Test1 的运行速度比 Test2 慢 85%,但两者在早期版本中的运行速度相当。