什麼是尾部呼叫優化(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。它向世界的釋出是謹慎的,並且可能需要為可感知的未來設定瀏覽器/引擎特定標誌。