X the Unknown Becoming an “X'' in an equation.

21八/110

慎用 javascript 的 closure

javascript 的对象有一个不足的地方是没有提供公有和私有成员的区分,不过通过 javascript 提供的 closure,弄出私有的效果不算太难,但是使用 closure 却有可能带来效率的降低。我弄了一个简单的测试:

closure_test.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var with_closure = (function() {
    var i = 0;
    var looper = function(loop) {
	var j;
	var start = (new Date()).getTime();
	for (j = 0; j < loop; ++j) {
	    i = i + 1;
	}
	var end = (new Date()).getTime();
 
	return end - start;
    }
 
    return looper;
})();
 
var without_closure = function (loop) {
    var i = 0;
    var j;
    var start = (new Date()).getTime();
    for (j = 0; j < loop; ++j) {
	i = i + 1;
    }
    var end = (new Date()).getTime();
 
    return end - start;
}

在 FF6 中,loop = 50000000的情况下:
With closure: 506 ms
Without closure: 269 ms

在 Chrome 15中,loop = 50000000的情况下:
With closure: 161 ms
Without closure: 78 ms

原因……估计大致是,内层函数需要先搜寻本函数内是否存在关于此变量的约束,如果不存在再去搜寻 closure 中的约束,这样的话自然就会使得变量的搜寻时间变长了。我没研究过 ECMAScript 的标准……不知道上面的猜测是否正确,就算正确也不知道是否是因为实现方式而导致的。

测试结果: closure 确实会带来性能的降低。虽然 closure 并非只是用来实现 javascript 中的私有,但如果仅仅是把 closure 用于实现私有,可能就有点滥用了。

或许你还会对这些文章感兴趣:

喜欢这个文章吗?

考虑订阅我们的RSS Feed吧!

评论 (0) 引用 (0)

还没有评论.


Leave a comment

还没有引用.