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

问题描述 投票:0回答:2

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

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"
javascript recursion
2个回答
2
投票

你的第一个版本

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。


0
投票

清洁外观代码

gnirtS
© www.soinside.com 2019 - 2024. All rights reserved.