什麼是尾部呼叫優化(TCO)

TCO 僅在嚴格模式下可用

一如既往地檢查瀏覽器和 Javascript 實現是否支援任何語言功能,並且與任何 javascript 功能或語法一樣,它可能在將來發生變化。

它提供了一種優化遞迴和深度巢狀函式呼叫的方法,它消除了將函式狀態推送到全域性幀堆疊的需要,並且通過直接返回初始呼叫函式來避免必須逐步執行每個呼叫函式。

function a(){
   return b(); // 2
} 
function b(){
   return 1;  // 3
}
a(); // 1

如果沒有 TCO,對 a() 的呼叫會為該函式建立一個新框架。當該函式呼叫 b() 時,a() 的幀被推入幀堆疊併為函式 b() 建立一個新幀

b() 返回 a() 時,a() 的幀從幀堆疊中彈出。它立即返回到全域性幀,因此不使用堆疊上的任何狀態。

TCO 認識到從 a()b() 的呼叫位於函式 a() 的尾部,因此不需要將 a() 的狀態推到幀堆疊上。當 b(0) 返回而不是返回 a() 時,它直接返回到全域性幀。通過消除中間步驟進一步優化。

TCO 允許遞迴函式具有無限遞迴,因為幀堆疊不會隨著每次遞迴呼叫而增長。沒有 TCO 遞迴函式具有有限的遞迴深度。

注意 TCO 是一個 javascript 引擎實現功能,如果瀏覽器不支援它,則無法通過轉換器實現。實現 TCO 所需的規範中沒有其他語法,因此擔心 TCO 可能會破壞 Web。它向世界的釋出是謹慎的,並且可能需要為可感知的未來設定瀏覽器/引擎特定標誌。