1 回答
TA贡献1845条经验 获得超8个赞
talk is weak
A:
function fomatSum(val){
return 'sum / 2 =' + val/2 ;
}
function comp(x,y){
var sum = x + y;
return fomatSum(sum);
}
comp(2,4);
B:
function fomatSum(val){
return 'sum / 2 =' + val/2 ;
}
function comp(x,y){
var sum = x + y;
var result = fomatSum(sum);
return result;
}
comp(2,4);
A、B两种写法都能得到相同的结果:sum / 2 = 3
在A中,当程序运行到return fomatSum的时候,此时comp函数已经做完了它该做的事情,只需要呼叫comp做接下来的事情。相当于接力赛,comp把接力棒(传入所需参数)给fomatSum后,comp就可以休息了(释放掉),故不需要comp的调用帧。
在B中,当程序运行到fomatSum函数的时候,就跑去执行fomatSum了,但是需要返回值给result(这时候就需要通过调用帧 回到comp函数中),然后return这个值。相当于餐馆点餐,服务员comp把菜单(传入所需参数)给厨师fomatSum后,comp还需要等待fomatSum把东西做好,再给顾客上餐,所以需要调用帧去找到服务员comp。
关于尾调用以及尾递归,建议配合 上下文 进行理解其目的和意义,这里有我之前写的一篇文章 从async await 报错Unexpected identifier 谈谈对上下文的理解 ,可以只看结尾对上下文的分析,希望有帮助。
添加回答
举报