日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[js] 举例说明js中什么是尾调用优化

發布時間:2023/12/9 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [js] 举例说明js中什么是尾调用优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[js] 舉例說明js中什么是尾調用優化

  • 寫在前面
  • 上次介紹了什么是尾調用以及怎么準確快速的判別一個函數調用是否為尾調用。那么,我們判別尾調用的意義是什么呢?做什么事情總歸有個目的,那么今天我們就來系統的介紹一下尾調用的意義,或者說尾調用有什么用吧。
    2. 尾調用優化

    我們知道,函數的調用會在內存中生成一個“調用幀”(call frame),保存著函數的調用位置和內部變量等信息。如果在函數A的內部調用函數B,那么在A的調用幀上方還會生成一個B的調用幀。等到函數B運行結束,將結果返回到A,B的調用幀才會消失。如果函數B的內部還調用函數C,那么在B的調用幀上方又會生成一個C的調用幀,以此類推。所有的調用幀就形成了一個“調用棧”(call stack)。

    我們知道,尾調用是函數的最后一步操作,外部函數的調用位置和其內部變量信息都不會再用到了,所以不需要保留外部函數的調用幀了,直接用內層函數的調用幀取代外層函數的調用幀即可。

    如果所有的函數都是尾調用,那么完全可以做到每次執行時的調用幀只有一項,這將大大的節省內存,更不可能發生內存溢出,這就是討論尾調用的意義所在。

    所謂的“尾調用優化”,其實就是保證在函數執行時只保留內層函數的調用幀,換句話說,就是用內層函數的調用幀取代外部函數的調用幀,即執行時內存中只保存一項調用幀。
    3. 如何做到尾調用優化

    通過上面的討論,我們知道了,只要外部函數的調用幀被內層函數的調用幀取代即可做到“尾調用優化”。同時,我們也知道調用幀是用來保存函數調用位置和內部變量信息的,所以,要想讓內層函數的調用幀取代外部函數的調用幀,只需要保證,在調用內層函數時,不再用到和外部函數有關的一切信息即可(不再用到外部函數的內部變量)。

    如此,我們總結出只有內層函數在被調用時不再用到外部函數的內部變量,才能做到“尾調用優化”。

    先來,看一個例子:

    function f(a) {var b = 3;function g(n) {return n + b}return g(a) }

    上述例子,我們明顯可以看出這是典型的尾調用,那么這有沒有做到“尾調用優化”呢?很明顯,可以看出在調用內部函數g的時候,其內部用到外部函數f 的內部變量b,故在函數g 被調用時,g 的調用幀并不能取代外部函數f 的調用幀,所以這不是“尾調用優化”。

    個人簡介

    我是歌謠,歡迎和大家一起交流前后端知識。放棄很容易,
    但堅持一定很酷。歡迎大家一起討論

    主目錄

    與歌謠一起通關前端面試題

    總結

    以上是生活随笔為你收集整理的[js] 举例说明js中什么是尾调用优化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。