在研究JavaScript中的闭包时,我想到了下面的小例子,但我并不真正理解发生了什么。
我希望通过在紧密循环的函数内使用
我希望通过在紧密循环的函数内使用
var
声明变量来玩弄垃圾收集器,以导致大量分配和释放。我试图通过将var
声明放在闭包的父级作用域中来避免这种情况,并期望闭包函数会更快。无论这个想法有多糟糕,我都遇到了这个小问题。var withClosure = function() {
var a, b, c, d, e, f, g;
return function () {
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
f = 6;
g = 7;
};
}();
var withoutClosure = function () {
var a = 1;
var b = 2;
var c = 3;
var d = 4;
var e = 5;
var f = 6;
var g = 7;
};
console.time("without");
for (var i = 0; i < 1000000000; i++) {
withoutClosure();
}
console.timeEnd("without");
console.time("withcsr");
for (var i = 0; i < 1000000000; i++) {
withClosure();
}
console.timeEnd("withcsr");
/*
Output on my machine:
without: 1098.329ms
withcsr: 8878.812ms
Tested with node v.6.0.0 and Chrome 50.0.2661.102 (64-bit)
*/
在父级作用域中分配变量使闭包在我的机器上运行速度比正常版本慢8倍。使用更多变量会使情况变得更糟。如果我只是读取变量而不是分配给它们,问题就不存在了。
这是什么原因导致的?有人能解释一下吗?
var
不会在紧密循环内分配和释放变量,因为这些声明是被提升的。 - user663031