所以这对我来说很困惑。变量是否昂贵? 我们来看看这段代码:
var div1 = document.createElement('div');
var div2 = document.createElement('div');
div2.appendChild(div1);
现在这个
var div2 = document.createElement('div');
div2.appendChild(document.createElement('div'));
所以,在第二个例子中,我做的与第一个例子相同。声明变量比不变更昂贵吗?我是否只是通过即时创建和使用元素来节省内存?
编辑:这是一个示例代码来说明问题。我知道在这种特殊情况下,内存保存(或不保存)最小。
答案 0 :(得分:7)
变量在JavaScript中非常便宜,然而,无论它们多么便宜,一切都有成本。
话虽如此,这并不是一个显着的差异,你应该考虑更多地考虑使你的代码可读而不是执行微优化。
您应该使用变量来保存重复的操作。在上面的示例中,您可能需要指向新创建的div
的变量,或者您将无法对其执行任何操作...除非您最终从中检索它DOM;因为DOM操作是JavaScript中最慢的部分之一,所以这将比变量的成本高出许多倍。
答案 1 :(得分:4)
理论上 ,通过不执行变量声明,您可以节省 微小的 内存,因为变量声明要求JavaScript引擎在变量绑定对象上为您声明它的执行上下文创建一个属性。 (参见规范,Section 10.5和相关章节。)
实际上 ,你永远不会注意到差异,即使是像IE这样的(相对)慢的引擎也是如此。随意使用变量,只要它们使代码更清晰。在变量绑定对象上创建属性(例如,声明变量)是非常非常非常快速操作。 (当然,避免它在全球范围内,但不是因为使用内存。)
警告 :如果变量引用了一个只暂存的大内存结构,那么和会在该函数上下文中创建闭包,大内存结构可能(在某些引擎中)在内存中保存的时间比必要的长。例如:
function foo(element) {
var a = /* ...create REALLY BIG structure here */;
element.addEventListener("event", function() {
// Do something **not** referencing `a` and not doing an `eval`
}, false);
}
在一个简单的引擎中,由于事件处理程序是对foo
调用的上下文的闭包,理论上a
可用于处理程序,因此它引用的内容仍然是“可引用的”,除非事件处理函数不再可引用,否则不可用于垃圾收集。在任何体面的引擎(如Chrome中的V8引擎)中,因为你既没有引用a
也没有在闭包(事件处理程序)中使用eval
,所以没关系。如果你想保护自己免受普通引擎的攻击,请在a
返回之前将undefined
设置为foo
,这样引擎(无论多么平庸)都知道事件处理程序不会引用该引擎结构,即使是引用a
。
答案 2 :(得分:0)
是的,你节省了记忆,不,它绝不是重要的数量。