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

时间:2018-03-03 08:45:08

标签: javascript

嘿,我无法正确理解这段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

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

1 个答案:

答案 0 :(得分: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