这个JavaScript foo()中发生了什么;功能? [重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

嘿,我无法正确理解这段JavaScript代码:

 foo(i) {
     if (i < 0)
         return;

     console.log('begin: ' + i);

     foo(i - 1);
     console.log('after: ' + i);
 }

 foo(3);

产量

begin: 3
begin: 2
begin: 1
begin: 0
after: 0
after: 1 
after: 2
after: 3

所以我知道在前四个输出的代码中发生了什么,但是无法理解代码中最后四个输出发生了什么,有人在最后四个输出中详细解释了这段代码,这对我来说真的很有帮助。

javascript
1个回答
1
投票

所以这个例子显示了执行时的递归函数调用:

 function foo(i)
  {
    if(i<0)
    return;
    console.log('begin: ' +i); // Line 1
    foo(i-1);  // Line 2
    console.log('after: ' +i);  // Line 3
  }
  foo(3);

首先,您调用第1行,然后在第2行再次调用该函数,然后再在第3行调用该函数

所以执行堆栈看起来像这样

console.log('begin: ' +3); // Line 1
foo(2);  // Line 2
console.log('after: ' +3);  // Line 3

现在下一个第2行将再次转换为:

console.log('begin: ' +3); // Line 1
console.log('begin: ' +2); // Line 1
foo(1); // Line 2
console.log('after: ' +2);  // Line 3

console.log('after: ' +3);  // Line 3

等等

console.log('begin: ' +3); // Line 1
console.log('begin: ' +2); // Line 1
console.log('begin: ' +1); // Line 1
foo(0); // Line 2
console.log('after: ' +1);  // Line 3
console.log('after: ' +2);  // Line 3

console.log('after: ' +3);  // Line 3

最后的迭代:

console.log('begin: ' +3); // Line 1
console.log('begin: ' +2); // Line 1
console.log('begin: ' +1); // Line 1
console.log('begin: ' +0); // Line 1
foo(-1) // Line 2 for negative value, we are exiting the recursion.
console.log('after: ' +0);  // Line 3
console.log('after: ' +1);  // Line 3
console.log('after: ' +2);  // Line 3

console.log('after: ' +3);  // Line 3
© www.soinside.com 2019 - 2024. All rights reserved.