【问题标题】:What's happening in this JavaScript foo(); function? [duplicate]这个 JavaScript foo(); 中发生了什么功能? [复制]
【发布时间】:2018-08-11 10:45:57
【问题描述】:

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

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

【问题讨论】:

  • 它是一个自调用函数。它在输入/计数器达到 0 时返回。

标签: javascript


【解决方案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

【讨论】:

  • i 的值在console.log('after) 中是如何增加的
  • 它没有增加。如果您看到...传递给 foo 的值正在减少,并且在第二个控制台之前出现,因此减少的值首先打印出来。
  • 所以i 的这些值在安慰之前被存储在哪里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2018-01-27
  • 2012-08-11
相关资源
最近更新 更多