gpt4 book ai didi

javascript - 从函数调用返回值时,最新的 JavaScript/ECMAScript 编译器是否会优化不必要的变量赋值?

转载 作者:行者123 更新时间:2023-12-01 03:19:27 24 4
gpt4 key购买 nike

假设我们位于一个实现文件处理的对象内。我想编写代码以便于阅读。

很难判断返回类型的代码示例,尤其是在存在多个嵌套函数调用时:

function create() {
return doCreateAction();
}

通过引入澄清变量,此示例更具可读性:

function create() {
var fileHandle = doCreateAction();
return fileHandle;
}

理论上,第二个版本可以执行相同的操作,因为编译器必须暂时存储 doCreateAction() 的结果(可能在某个隐藏的、匿名的、短期的临时变量中)。当分配给命名变量时,这段代码是否会变慢?

最佳答案

我想说要么他们确实优化了变量,要么不值得打扰;无论哪种情况,你都有更大的鱼要煎。 :-) 但是与尾部调用相关的一个有趣的方面。

但首先,就简单性能而言:根据经验,this simplistic, synthetic test表明函数的性能不会根据是否存在变量而变化。另请注意,如果您使用合适的压缩器,压缩器可能会在 JavaScript 引擎查看之前为您删除该变量。

转向尾部调用:正如您所知,从严格模式下的 ES2015 开始,规范要求尾部调用优化(TCO),这意味着当函数 A 返回调用的结果时A 将控制权直接传递给 B,然后将结果返回给调用者,而不是让 B 将其结果返回给 A,然后将其返回给调用者。这在很多方面都更加高效(避免在堆栈上创建另一个帧,避免跳转)。

现在,这可能并不重要,因为 JavaScript 引擎中 TCO 的开发即使没有停止,至少也已经停滞了。 V8团队开发了早期版本但放弃了,SpiderMonkey也没有;据我所知,只有 Safari 中的 JavaScriptCore 具有 TCO。但如果我read the spec正确(绝非易事),您的第一个示例在尾部位置有 doCreateAction ,因此可以通过 TCO 进行优化,但您的第二个示例则不然。

因此,如果 TCO 得到广泛实现,并且实现情况稍微超出了此类情况的规范,那么在这方面可能会产生影响,在这种情况下,效果,尾调用。

<小时/>

我过去对于在这种情况下使用变量进行调试相当严格;然而,Chrome 开发工具的最新版本使得它没有必要用于这个目的(当然,缩小器无论如何都会将其删除):如果您进入返回,您会看到本地范围变量列表中的返回值。当然,这仅在您使用 Chrome 的开发工具时才有用(例如,Firefox 还没有这样做?)。

关于javascript - 从函数调用返回值时,最新的 JavaScript/ECMAScript 编译器是否会优化不必要的变量赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45323358/

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