gpt4 book ai didi

ecmascript-6 - 绑定(bind)函数是否支持 ES6 中的正确尾调用?

转载 作者:行者123 更新时间:2023-12-04 05:14:49 38 4
gpt4 key购买 nike

在 ECMAScript 2015 语言规范中,Function.prototype.apply 的定义和 Function.prototype.call两者都将“Perform PrepareForTailCall()”作为其步骤之一,因此我们知道这些函数支持适当的尾调用(即尾调用优化)。

[[Call]] on bound function objects的定义,但是,省略了 PrepareForTailCall()。这是否意味着绑定(bind)函数不支持正确的尾部调用,并且递归调用自身的绑定(bind)函数可能会炸毁堆栈?

最佳答案

The definition of [[Call]] on bound function objects omits PrepareForTailCall(). Does this mean that bound functions do not support proper tail calls, and that a bound function calling itself recursively could blow up the stack?

没有。 PrepareForTailCall 发生在 EvaluateDirectCall during the evaluation of the call expression 中,它检查该表达式是否在尾部位置。当准备好尾调用时,当前运行的执行上下文被删除,在函数之前 called , 在各自的 [[Call]] 内部方法上调度。新的运行执行上下文在 PrepareForOrdinaryCall 中设置来自 [[Call]] method of user-defined functions . [[Call]] method of bound functions只是在此之前引入了一个额外的间接级别。

In the ECMAScript 2015 Language Specification, the definitions of Function.prototype.apply and Function.prototype.call both include "Perform PrepareForTailCall()" as one of their steps, so we know that these functions support proper tail calls.

是的,这是必要的,因为 [[Call]] method of built-in functions设置一个新的运行执行上下文(用于“实现定义的步骤”)。 PrepareForTailCall 将在调用实际函数之前丢弃这个“内置上下文”。

callapply 方法是调用函数的函数,当它们被调用时,堆栈上有两个调用需要进行尾调用优化。 (将此与 - 例如 - Array.prototype.map 进行对比,它也调用其他函数,但此处 map 执行上下文保留在调用堆栈中。在 callapplyCall() 确实在算法的尾部位置。

关于ecmascript-6 - 绑定(bind)函数是否支持 ES6 中的正确尾调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50419625/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com