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 談談對上下文的理解 ,可以只看結尾對上下文的分析,希望有幫助。
添加回答
舉報