2019-10-24:(递归函数的疑惑、堆栈相关知识)
functionfoo(i){
if(i<0)
return;
console.log('begin:'+i);
foo(i-1);
console.log('end:'+i);
}
foo(3);
输出:
begin:3
begin:2
begin:1
begin:0
end:0
end:1
end:2
end:3
当时的疑问:为什么begin输出完了之后还会输出end,而且还是倒过来输出(0123)?return不是跳出来了吗不执行了吗?应该只输出:begin:3 begin:2 begin:1 begin:0 才对呀。
因为在执行函数内部里的foo(i-1)时,后面的console.log('end:'+i)在等待foo(i-1)循环完毕之后才会执行而且一定会执行的(因为第一次判断i=3>0通过了,后面的语句都一定会执行)。而foo(i-1)中又有下一次循坏,里面又多了一个console.log('end:'+i)在等待循环。4次完毕后会输出begin:3 begin:2 begin:1 begin:0 下一次循环foo(0-1=-1)后判断不符合条件return回去上一层,接着输出循环最里面等待的end:0开始执行,然后到外一层的end:1,然后end:2 end:3
所以return只会在最里面的那次循环中执行一次,然后一层一层的执行后面由于循环而在等待的东西,现在看起来这种相当于内部嵌套了一层层的功能相同的函数罢了(将foo(i-1)当做是foo(i-1){if(i<0)return;......})
网友评论