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