深入JS中的问题(备忘)

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;......})

你可能感兴趣的:(深入JS中的问题(备忘))