递归的结果在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)
给出的字符。
由于函数reverse
在str
为长度0时没有返回值(这与"S".substr(1)
有关)reverse(str.substr(1))
的值是undefined
。
这导致undefinedS
。
你的第二个版本
此版本创建一个调用堆栈,其中字符串被n-1(其中n是其长度)慢慢拆开,直到其长度为1.此时堆栈被展开,导致从最后一个到第一个的每个字母都被返回。每个函数都调用它自己的Execution上下文,其中Variable Environment保存每个字符串的值。
调用堆栈展开的结果是qazxsw poi。
另一答案
清洁外观代码
gnirtS
以上是关于递归的结果在javascript中存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章