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 用于实现私有,可能就有点滥用了。