簡體   English   中英

綁定函數是否支持ES6中正確的尾調用?

[英]Do bound functions support proper tail calls in ES6?

在ECMAScript 2015語言規范中, Function.prototype.applyFunction.prototype.call的定義都包含“Perform PrepareForTailCall()”作為其中一個步驟,因此我們知道這些函數支持正確的尾調用(即尾調用)優化)。

但是, 綁定函數對象[[Call]]定義省略了PrepareForTailCall()。 這是否意味着綁定函數不支持正確的尾調用,並且遞歸調用自身的綁定函數可能會炸毀堆棧?

綁定函數對象的[[Call]]定義省略了PrepareForTailCall() 這是否意味着綁定函數不支持正確的尾調用,並且遞歸調用自身的綁定函數可能會炸毀堆棧?

EvaluateDirectCall調用表達式期間, PrepareForTailCallEvaluateDirectCall發生,它會檢查該表達式是否處於尾部位置。 當制備尾調用,當前運行的執行上下文被丟棄時,在功能之前調用 ,調度在各自[[Call]]內部方法。 新的運行執行上下文在PrepareForOrdinaryCall根據用戶定義函數[[Call]]方法設置 綁定函數[[Call]]方法在此之前引入了額外的間接級別。

在ECMAScript 2015語言規范中, Function.prototype.applyFunction.prototype.call的定義都包含“ Perform PrepareForTailCall() ”作為其中一個步驟,因此我們知道這些函數支持正確的尾調用。

是的,這是必要的,因為內置函數[[Call]]方法設置了一個新的運行執行上下文(對於“實現定義的步驟”)。 正是這個“內置上下文”, PrepareForTailCall將在調用實際函數之前刪除。

callapply方法是調用函數的函數,當調用它們時,堆棧上有兩個需要進行尾調用優化的調用。 (將此對比 - 例如 - Array.prototype.map ,它也調用其他函數,但這里map執行上下文保留在調用堆棧上。在callapplyCall()確實處於算法的尾部位置)。

請參見§12.3.4.1( 運行時語義:評估 )。 首先,我們做IsInTailPosition ,然后我們做EvaluateDirectCall - 其結果是F.[[Call]] 換句話說,當我們進行實際通話時,我們已經知道我們是否處於尾部位置。

但是,正如您所提到的,除了Safari之外,JS 在任何瀏覽器上沒有經過尾部優化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM