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

标签 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

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

最佳答案

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

 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

关于javascript - 这个 JavaScript foo(); 中发生了什么?功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49082343/

相关文章:

javascript - 带有 src 和内容的 script-Tag 是什么意思?

javascript - 如何清除 After Effects 脚本中的所有关键帧?

javascript - chrome 控制台有粘贴功能吗?

php - 创建区域相关时钟

javascript - 下划线不会从 html 中消失

javascript - Google Apps 脚本 - 尝试使用 getUrl。类型错误 : Cannot find function getUrl in object Sheet

javascript - JS 中如何处理 NaN?

javascript - Gulp Angular 构建模板缓存问题

javascript - 我应该在 React 中定义模型类吗?

javascript - 通过键字符串从对象数组中删除属性