[英]Do bound functions support proper tail calls in ES6?
在ECMAScript 2015語言規范中, Function.prototype.apply
和Function.prototype.call
的定義都包含“Perform PrepareForTailCall()”作為其中一個步驟,因此我們知道這些函數支持正確的尾調用(即尾調用)優化)。
但是, 綁定函數對象的[[Call]]定義省略了PrepareForTailCall()。 這是否意味着綁定函數不支持正確的尾調用,並且遞歸調用自身的綁定函數可能會炸毀堆棧?
綁定函數對象的
[[Call]]
定義省略了PrepareForTailCall()
。 這是否意味着綁定函數不支持正確的尾調用,並且遞歸調用自身的綁定函數可能會炸毀堆棧?
在EvaluateDirectCall
調用表達式期間, PrepareForTailCall
在EvaluateDirectCall
中發生,它會檢查該表達式是否處於尾部位置。 當制備尾調用,當前運行的執行上下文被丟棄時,在功能之前調用 ,調度在各自[[Call]]
內部方法。 新的運行執行上下文在PrepareForOrdinaryCall
根據用戶定義函數的[[Call]]
方法設置 。 綁定函數的[[Call]]
方法在此之前引入了額外的間接級別。
在ECMAScript 2015語言規范中,
Function.prototype.apply
和Function.prototype.call
的定義都包含“ PerformPrepareForTailCall()
”作為其中一個步驟,因此我們知道這些函數支持正確的尾調用。
是的,這是必要的,因為內置函數的[[Call]]
方法設置了一個新的運行執行上下文(對於“實現定義的步驟”)。 正是這個“內置上下文”, PrepareForTailCall
將在調用實際函數之前刪除。
call
和apply
方法是調用函數的函數,當調用它們時,堆棧上有兩個需要進行尾調用優化的調用。 (將此對比 - 例如 - Array.prototype.map
,它也調用其他函數,但這里map
執行上下文保留在調用堆棧上。在call
和apply
, Call()
確實處於算法的尾部位置)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.