亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

尾部調用優化時候遇到的問題

尾部調用優化時候遇到的問題

江戶川亂折騰 2018-12-27 22:19:15
在看阮一峰老師的es6,在尾部調用優化那一節,我對文章中提到的我們知道,函數調用會在內存形成一個“調用記錄”,又稱“調用幀”(call frame),保存調用位置和內部變量等信息。如果在函數A的內部調用函數B,那么在A的調用幀上方,還會形成一個B的調用幀。等到B運行結束,將結果返回到A,B的調用幀才會消失。如果函數B內部還調用函數C,那就還有一個C的調用幀,以此類推。所有的調用幀,就形成一個“調用?!保╟all stack)尾調用由于是函數的最后一步操作,所以不需要保留外層函數的調用幀,因為調用位置、內部變量等信息都不會再用到了,只要直接用內層函數的調用幀,取代外層函數的調用幀就可以了。這兩段話并不能很好的理解,有哪位大神能解釋解釋
查看完整描述

1 回答

?
精慕HU

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


查看完整回答
反對 回復 2019-01-25
  • 1 回答
  • 0 關注
  • 341 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號