在JavaScript中,在未附加到DOM树的函数中创建的节点是否会使空间混乱?

在JavaScript中,在未附加到DOM树的函数中创建的节点是否会使空间混乱?,javascript,dom,memory-management,scope,nodes,Javascript,Dom,Memory Management,Scope,Nodes,我有一个习惯,为了代码的可读性,在顶部块声明作用域中的每个变量。我怀疑函数范围内未添加到文档主体的节点会使空间变得混乱,并降低性能。他们怎么了?一般来说,在函数范围内创建的变量会发生什么变化?在函数执行后,它们是否被销毁?我需要担心释放内存吗?在作用域的最顶层块声明变量是一种好的做法,还是只在需要变量或某些条件为真时才在现场声明变量更好?这有助于提高运行时性能吗 假设函数如下: function myfunc() { var someNode = document.createEleme

我有一个习惯,为了代码的可读性,在顶部块声明作用域中的每个变量。我怀疑函数范围内未添加到文档主体的节点会使空间变得混乱,并降低性能。他们怎么了?一般来说,在函数范围内创建的变量会发生什么变化?在函数执行后,它们是否被销毁?我需要担心释放内存吗?在作用域的最顶层块声明变量是一种好的做法,还是只在需要变量或某些条件为真时才在现场声明变量更好?这有助于提高运行时性能吗

假设函数如下:

function myfunc() {
    var someNode = document.createElement('div');
    if(someCondition) { // add the node only if some condition is true
        document.body.appendChild(someNode);
    }
function myfunc() {
    if(someCondition) { // create and add the node only if some condition is true
        var someNode = document.createElement('div');
        document.body.appendChild(someNode);
    }
}
V.S是这样一个函数:

function myfunc() {
    var someNode = document.createElement('div');
    if(someCondition) { // add the node only if some condition is true
        document.body.appendChild(someNode);
    }
function myfunc() {
    if(someCondition) { // create and add the node only if some condition is true
        var someNode = document.createElement('div');
        document.body.appendChild(someNode);
    }
}

Javascript通过垃圾收集实现自动内存管理。如果作用域中没有引用一段数据的变量,则应回收内存。因此,在您的示例中,未使用的DIV将在函数退出时销毁(或者在函数退出后不久,在下一次垃圾收集发生时销毁)


但是,最好避免制作您不需要的对象。它需要时间,并在函数运行时耗尽内存。对于小而简单的对象(即您使用literal
{…}
语法创建的对象)和数组来说,这并不太糟糕,但是节点是非常复杂的对象。

Javascript通过垃圾收集实现自动内存管理。如果作用域中没有引用一段数据的变量,则应回收内存。因此,在您的示例中,未使用的DIV将在函数退出时销毁(或者在函数退出后不久,在下一次垃圾收集发生时销毁)


但是,最好避免制作您不需要的对象。它需要时间,并在函数运行时耗尽内存。对于小的、简单的对象(即使用literal
{…}
语法创建的对象)和数组来说,这并不太糟糕,但是节点是相当复杂的对象。

此外,声明变量的位置也不重要(因为变量声明总是在其作用域的顶部);重要的是创建节点并将其分配给变量的位置。例外情况是旧IE处理闭包,其中嵌套函数将保留范围内的所有内容,即使没有直接引用。尽管这已经不是什么大问题了。但+1表示“最好避免制作您不需要的对象”。垃圾收集并不意味着我们不需要考虑内存。@bfavaretto当OP写“声明每个变量的习惯”时,我认为他实际上是指“分配每个变量的习惯”,正如他的例子所示。@Barmar他似乎没有意识到,我认为指出这一点会有所帮助。@Barmar在不创建未使用的对象方面提出了一个很好的观点。根据你所说的,我认为最好在需要的时候创建对象,特别是节点。我也知道提升,但我发现当所有使用的变量都分配在块的顶部时,读取和调试代码更容易。而且,声明变量的位置并不重要(因为变量声明总是在其范围的顶部);重要的是创建节点并将其分配给变量的位置。例外情况是旧IE处理闭包,其中嵌套函数将保留范围内的所有内容,即使没有直接引用。尽管这已经不是什么大问题了。但+1表示“最好避免制作您不需要的对象”。垃圾收集并不意味着我们不需要考虑内存。@bfavaretto当OP写“声明每个变量的习惯”时,我认为他实际上是指“分配每个变量的习惯”,正如他的例子所示。@Barmar他似乎没有意识到,我认为指出这一点会有所帮助。@Barmar在不创建未使用的对象方面提出了一个很好的观点。根据你所说的,我认为最好在需要的时候创建对象,特别是节点。我也知道提升,但我发现当所有使用的变量都分配在块的顶部时,读取和调试代码更容易。