javascript声明变量与否

时间:2012-01-07 00:26:46

标签: javascript

所以这对我来说很困惑。变量是否昂贵? 我们来看看这段代码:

var div1 = document.createElement('div');
var div2 = document.createElement('div');

div2.appendChild(div1);

现在这个

var div2 = document.createElement('div');

div2.appendChild(document.createElement('div'));

所以,在第二个例子中,我做的与第一个例子相同。声明变量比不变更昂贵吗?我是否只是通过即时创建和使用元素来节省内存?

编辑:这是一个示例代码来说明问题。我知道在这种特殊情况下,内存保存(或不保存)最小。

3 个答案:

答案 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)

是的,你节省了记忆,不,它绝不是重要的数量。