javascript是否声明变量



所以这让我很困惑。变量是否昂贵?让我们看看这个代码:

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

现在这个

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

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

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

变量在JavaScript中非常便宜,但无论多么便宜,一切都有成本。

话虽如此,这并不是一个明显的区别,您应该更多地考虑让代码可读,而不是执行微优化。

您应该使用变量来保存重复的操作。在上面的示例中,您可能需要指向新创建的div的变量,否则您将无法对其执行任何操作……除非您最终从DOM中检索它;事实证明,DOM操作是JavaScript中速度最慢的部分之一,因此其成本将是变量的数倍。

理论上 ,您通过不进行变量声明来节省的内存量非常小,因为变量声明要求JavaScript引擎为您声明它的执行上下文变量绑定对象上创建一个属性。(请参阅规范第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,所以这是可以的。如果您想保护自己免受平庸引擎的攻击,请在foo返回之前将a设置为undefined,这样引擎(无论多么平庸)都知道,即使事件处理程序引用a,它也不会引用该结构。

是的,你节省了内存,不,这绝对不是一个重要的量。

最新更新