递归的结果在javascript中存储在哪里?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归的结果在javascript中存储在哪里?相关的知识,希望对你有一定的参考价值。

当我调用递归函数时,调用的结果在哪里?

function reverse(str){ 
    if (str.length == 1){ 
      return str;
    } 
  rev = reverse(str.substr(1)) + str.charAt(0);
}

reverse("String"); 
console.log(rev); // ----> "undefinedS" - Only the last call is saved.

如果我只是返回值,它似乎很好。结果存储在哪里?

function reverse(str){ 
    if (str.length == 1){ 
      return str
    } 
  return reverse(str.substr(1)) + str.charAt(0);
}

reverse("String") // ----> "gnirtS"
答案

你的第一个版本

rev存储在全局命名空间中,每次调用函数reverse时都会被覆盖。

在仅取最后n-1个字符后,当字符串的长度为1时,递归停止。结果,最后一个字符是字符串中唯一的字符S,这就是str.charAt(0)给出的字符。

由于函数reversestr为长度0时没有返回值(这与"S".substr(1)有关)reverse(str.substr(1))的值是undefined

这导致undefinedS

你的第二个版本

此版本创建一个调用堆栈,其中字符串被n-1(其中n是其长度)慢慢拆开,直到其长度为1.此时堆栈被展开,导致从最后一个到第一个的每个字母都被返回。每个函数都调用它自己的Execution上下文,其中Variable Environment保存每个字符串的值。

调用堆栈展开的结果是qazxsw poi。

另一答案

清洁外观代码

gnirtS

以上是关于递归的结果在javascript中存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中递归计算整数数组的总和

如何在二叉树中返回迭代遍历的迭代器?

如何将递归函数的返回值保存在变量 JavaScript 中

Node.js / Javascript 多重递归承诺在视图中返回

JavaScript双递归调用,如何传回结果?

在 JavaScript 中存储的全局范围内创建的常量在哪里?