繁体   English   中英

memory 如何在 JavaScript 中使用 arrays 进行递归分配

[英]How is memory allocation for recursion with arrays in JavaScript

我想了解,当我将 globalArray 作为参数发送给递归 function,并将相同的数组(localArray)分配给 globalArray 时,ZDE9B9ED78D7E2E911DCEEFFEE780ZF2 中的 memory 分配是如何发生的。 我知道每个递归都会有它自己的调用堆栈,并且它会有自己的变量副本,但是由于我将 globalArray 传递到 function 中,localArray 的副本是否总是存储为每个调用堆栈中的新数组?

如果我要实现 localArray 作为每个执行上下文的相同 localArray 变量的增量副本,我将如何实现呢?

请查看图片和代码片段在此处输入图像描述

function testFunction(localArray){
    globalArray = localArray;
    if(itr < 5) {
        globalArray.push(1);
        itr++;
        testFunction(localArray);
    }
}

var globalArray = [1,2,3];

var itr = 0;

testFunction(globalArray);

[稍后添加到这个问题]

但是,如果我稍微修改一下代码,将 localArray 设置为 null,如果它是一个被引用的值,那么 globalArray 仍然会保存数据。

function testFunction(localArray){
    globalArray = localArray;
    localArray = null;
    if(itr < 5) {
        globalArray.push(1);
        itr++;
        testFunction(globalArray);
}
}

var globalArray = [1,2,3];

var itr = 0;

testFunction(globalArray);

在此处输入图像描述

...由于我将 globalArray 传递给 function,因此 localArray 的副本是否会始终作为新数组存储在每个调用堆栈中?

不。正如您问题的评论者指出的那样, arrays 作为值通过引用传递,这意味着globalArray变量表示 memory 中存在该数组的位置。 如果您更改指向数组的变量(即globalArray =... ),您只是在更改该变量。 但是,如果您修改一个数组(例如globalArray.push(...) ),您将更改 memory 中查找该数组的每个变量的内容,无论您使用哪个变量名,或者它存在于堆栈中的什么位置.

如果我要实现 localArray 作为每个执行上下文的相同 localArray 变量的增量副本,我将如何实现呢?

有几种方法可以做这样的事情。

例如,您可以在将数组传递到下一个递归级别之前克隆该数组,但如果您最终递归非常深入,这可能会花费大量时间,并且 memory 创建 arrays 并复制您可能永远不会使用的值。

或者,您可以创建类似于链表节点的 memory 结构,而不是使用 arrays 结构,并且每个级别在前一个节点的末尾添加一个节点以作为变量传递。 这样,仍然可以在需要时遍历调用堆栈中的所有元素,但是您使用的 memory 数量与调用堆栈的深度成正比。

您还可以重用单个全局数组,随着调用堆栈的深入,您可以将其push ,但是在从每个递归级别返回之前pop值:基本上维护一个与调用堆栈平行的有状态堆栈。

最好的方法可能取决于递归算法的细节,以及每个级别实际需要维护的数据量。 根据我的经验,传入每个级别的局部参数通常是相对“平坦”的汇总值,例如当前的递归depth ,而全局变量是您维护 state 的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM