Javascript递归函数在这两种情况下的执行方式不同

Javascript递归函数在这两种情况下的执行方式不同,javascript,function,recursion,Javascript,Function,Recursion,问题是当您以0开始测试时,在输入ifconsole.log(“HI!”)之后它正在运行的事实 但是当您使用3开始测试时,console.log(“HI!”)它退出循环而不运行它 有什么区别?无论哪种方式,它都会进入if,但在一种情况下,它会在if之后继续读取代码,而在另一种情况下,它不会在if之后读取代码 我认为这是javascript中的一个bug。 有人能解释这两者的区别吗 function test(numb){ if(numb == 3) { return console.l

问题是当您以0开始测试时,在输入if
console.log(“HI!”)之后它正在运行的事实

但是当您使用3开始测试时,
console.log(“HI!”)它退出循环而不运行它

有什么区别?无论哪种方式,它都会进入if,但在一种情况下,它会在if之后继续读取代码,而在另一种情况下,它不会在if之后读取代码

我认为这是javascript中的一个bug。 有人能解释这两者的区别吗

function test(numb){
  if(numb == 3) {
    return console.log("Finish!");
  } else {
    test(numb = numb + 1);
  };
  return console.log("HI!");
};

test(0)

我不确定我是否理解正确,但是当测试函数使用参数3运行时,它不应该返回
console.log(“HI!”)因为您放置了
返回console.log(“Finish!”)返回将返回值并停止函数

我重新组织了代码

function test(numb){
  if(numb === 3) { 
    console.log("Finish!"); // line 3
    return; // line 4
  }
  test(++numb); // line  6
  console.log("HI! " + numb); // line 7
};

(1) 当numb=3时

  • 第3行:打印“完成!”
  • 第4行:返回。我们退出函数
(2) 当numb=0时,输出为:

"Finish!"

3

2

1

首先,我们调用test(0),test(0)将被推到内存堆栈上,在第6行中,test(1)将被调用,test(1)也将被推到堆栈上,其中局部变量numb变为1,……最后,将调用test(3),执行第3行和第4行,“Finish!”将被打印,然后我们将返回test(2),仍在堆栈上,将打印3个。然后我们返回测试(1)…最后,我们返回测试(0),其中1将被打印。

首先介绍问题,然后发布相关代码。因为第一个分支有“return”,而另一个分支没有。返回退出函数。为什么
返回
console.log()
(始终是
未定义的
)的返回值?在JavaScript中,使用“==”而不是“==”当您使用3作为参数调用它时,为什么它会打印“HI!”?执行开始,计算分支,numb==3为真,因此它调用
console.log
,并返回与代码指定完全相同的结果。故事结束了。这有什么奇怪的?你是对的,当我以3开头时,无论如何它都不会返回`console.log(“HI!”);'。但当我以0开头时,它返回“console.log(“HI!”);”。为什么我会得到不同的结果,尽管条件是以任何方式满足的?因为在其他条件下,你不返回任何东西,你只需调用相同的函数,然后将完成该函数,如果你像这个返回测试(numb=numb+1)一样放置返回;该函数将停止并运行console.log(“HI!”);永远不会出现