尾呼叫優化

2022-10-09 21:57:27 字數 1129 閱讀 2271

一、什麼是尾呼叫(tail call)

乙個函式a內部的最後一步是呼叫函式b,函式b呼叫後的返回值被函式a返回的情形

function f(x) 

return n(x);

}

以下兩種情況均不屬於尾呼叫,因為在函式呼叫後還有其他的操作:

// 情況一

function f(x)

// 情況二

function f(x)

二、呼叫棧及尾呼叫優化

在了解尾呼叫優化前,需要先理解呼叫棧,呼叫棧是直譯器(比如瀏覽器中的 j**ascript 直譯器)追蹤函式執行流的一種機制。當執行環境中呼叫了多個函式時,通過這種機制,我們能夠追蹤到哪個函式正在執行,執行的函式體中又呼叫了哪個函式

const fn1 = (a) => 

const fn2 = (x) =>

const result = fn2(1); // line b

在上面的**中,首先fn2被壓入棧,xy依次被建立並賦值,棧內也會記錄相應的資訊,同時也記錄了該函式被呼叫的地方,這樣在函式 return 後就能知道結果應該返回到**。

當fn2中執行到fn1時,fn1入棧,當它執行結束後就可以出棧,之後fn2也得到了想要的結果,返回結果後也出棧,此段**執行結束,如下圖所示:

觀察上圖,第2、3步驟中的fn2,它內部的一切計算都已經完成了,此時它在棧內的唯一作用就是記錄最後結果應該返回到哪一行。因而可以有如下的優化:

這正是尾呼叫優化,用內層函式的呼叫棧取代外層函式的呼叫棧即可不會增加呼叫棧的深度,通過尾呼叫優化可減少記憶體空間的使用,也能提高執行速度。

es6中,第一次明確規定,所有 ecmascript 的實現,都必須部署"尾呼叫優化",目前各瀏覽器的實現情況具體見這裡

尾呼叫優化

尾呼叫 tail call 是函式式程式設計的乙個重要概念,本文介紹它的含義和用法。一 什麼是尾呼叫?尾呼叫的概念非常簡單,一句話就能說清楚,就是指某個函式的最後一步是呼叫另乙個函式。function f x 上面 中,函式f的最後一步是呼叫函式g,這就叫尾呼叫。以下兩種情況,都不屬於尾呼叫。情況一...

尾呼叫優化

本文 日期 2015年4月10日 尾呼叫 tail call 是函式式程式設計的乙個重要概念,本文介紹它的含義和用法。尾呼叫的概念非常簡單,一句話就能說清楚,就是指某個函式的最後一步是呼叫另乙個函式。function f x 上面 中,函式f的最後一步是呼叫函式g,這就叫尾呼叫。以下兩種情況,都不屬...

尾呼叫優化

尾呼叫的概念非常簡單,一句話就能說清楚,就是指某個函式的最後一步是呼叫另乙個函式。function f x 上面 中,函式f的最後一步是呼叫函式g,這就叫尾呼叫。以下兩種情況,都不屬於尾呼叫。情況一 function f x 情況二 function f x 上面 中,情況一是呼叫函式g之後,還有別...