Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个JavaScript调用堆栈如何跳过条件并执行其余的?_Javascript_Recursion_Callstack - Fatal编程技术网

这个JavaScript调用堆栈如何跳过条件并执行其余的?

这个JavaScript调用堆栈如何跳过条件并执行其余的?,javascript,recursion,callstack,Javascript,Recursion,Callstack,函数倒计时(x){ 控制台日志(x+“A”); 如果(x==0){ console.log(“完成!”); //返回; }否则{ 控制台日志(x+“…”); 倒计时(x-1);//每次它到达这里时,coundown(x-1)被添加到调用堆栈中,对吗? 控制台日志(x+“B”); } 控制台日志(x+“C”); } 倒计时(2)也许这将帮助您了解事件的顺序 函数倒计时(x){ var log=s=>console.log(“”。重复(8-4*x)+s); 对数(x+“A”); 如果(x==0){

函数倒计时(x){
控制台日志(x+“A”);
如果(x==0){
console.log(“完成!”);
//返回;
}否则{
控制台日志(x+“…”);
倒计时(x-1);//每次它到达这里时,coundown(x-1)被添加到调用堆栈中,对吗?
控制台日志(x+“B”);
}
控制台日志(x+“C”);
}

倒计时(2)也许这将帮助您了解事件的顺序

函数倒计时(x){
var log=s=>console.log(“”。重复(8-4*x)+s);
对数(x+“A”);
如果(x==0){
日志(“完成!”);
//返回;
}否则{
对数(x+“…”);
log('callingcountdown(+(x-1)+'));
倒计时(x-1);
log('倒计时('+(x-1)+')已返回');
对数(x+“B”);
}
对数(x+“C”);
}

倒计时(2)也许这将帮助您了解事件的顺序

函数倒计时(x){
var log=s=>console.log(“”。重复(8-4*x)+s);
对数(x+“A”);
如果(x==0){
日志(“完成!”);
//返回;
}否则{
对数(x+“…”);
log('callingcountdown(+(x-1)+'));
倒计时(x-1);
log('倒计时('+(x-1)+')已返回');
对数(x+“B”);
}
对数(x+“C”);
}

倒计时(2)这里要理解的概念是,当执行同步功能时,系统会等待结果

因此,如果一个函数是嵌套的,并像您的示例中那样调用它自己,那么它将像:

  • 倒计时(2)等待倒计时(1)
  • 倒计时(1)等待倒计时(0)
  • 倒计时(0)发送其结果
  • 继续倒计时(1)并发送结果
  • 继续倒计时(2)并发送结果
以下是完整的事件链:

  • 执行倒计时(2)
  • 输出
    2A
  • 进入
    if=>else
    语句
  • 输出
    2…
  • 执行倒计时(1)
  • 输出
    1A
  • 进入
    if=>else
    语句
  • 输出
    1…
  • 执行倒计时(0)
  • 输出
    0a
  • 进入
    if
    语句
  • 输出<代码>完成
  • 退出
    if
    语句
  • 输出
    0c
  • 将结果返回到倒计时(1)
  • 倒计时(1)
    继续执行
  • 输出
    1b
  • 超出
    if=>else
    语句
  • 输出
    1c
  • 将结果返回到倒计时(2)
  • 倒计时(2)
    继续执行
  • 输出
    2b
  • 超出
    if=>else
    语句
  • 输出
    2 C

  • 这里要理解的概念是,当执行同步功能时,系统会等待结果

    因此,如果一个函数是嵌套的,并像您的示例中那样调用它自己,那么它将像:

    • 倒计时(2)等待倒计时(1)
    • 倒计时(1)等待倒计时(0)
    • 倒计时(0)发送其结果
    • 继续倒计时(1)并发送结果
    • 继续倒计时(2)并发送结果
    以下是完整的事件链:

    • 执行倒计时(2)
    • 输出
      2A
    • 进入
      if=>else
      语句
    • 输出
      2…
    • 执行倒计时(1)
    • 输出
      1A
    • 进入
      if=>else
      语句
    • 输出
      1…
    • 执行倒计时(0)
    • 输出
      0a
    • 进入
      if
      语句
    • 输出<代码>完成
    • 退出
      if
      语句
    • 输出
      0c
    • 将结果返回到倒计时(1)
    • 倒计时(1)
      继续执行
    • 输出
      1b
    • 超出
      if=>else
      语句
    • 输出
      1c
    • 将结果返回到倒计时(2)
    • 倒计时(2)
      继续执行
    • 输出
      2b
    • 超出
      if=>else
      语句
    • 输出
      2 C

    A从不被跳过……有2A、1A和0A,所以它从不被跳过。。。因此,跳过B的唯一时间是当函数的参数为0no时,
    倒计时(x-1)
    立即执行,并且只有当它完成时,在它执行后的代码才不会被跳过……有2A、1A和0A,所以它不会被跳过。。。因此,跳过B的唯一时间是当函数的参数为0no时,
    倒计时(x-1)
    立即执行,并且只有当它在执行后完成代码时,因此,每当它到达行
    倒计时(x-1)
    ,它不会跳转并运行
    倒计时()
    函数,它转到下一行并将其余语句放入调用堆栈,对吗?因此,调用堆栈并不包含
    countdown()
    函数本身,而是包含其余语句的值?@AmeenAhsan-不,这就是你在问题中一直说的,不要这样想。。。看看输出的缩进,它显示了函数的哪个“迭代”如果javascript按照您所说的方式工作,那么您就不能使用函数调用的结果,因为函数在当前函数结束之前不会运行,所以不可能使用JS作为解释语言,它会逐行执行代码,对吗?那么,它从第一行一行一行地转到最后一行,并将none executed语句添加到调用堆栈中?我对调用堆栈的理解是错误的吗?是的,你误解了调用堆栈的意义——再一次,想想一个返回v的函数