从JS引擎理解Await 与.then()的堆栈处理

从JS引擎理解Await 与.then()的堆栈处理
最新回答
安非他命

2021-06-11 01:03:47

Async/Await并非简单的语法糖,它能提高代码可读性,并优化JavaScript引擎对堆栈信息的处理。

与Promise相比,Async/Await的一个关键区别在于,await会暂停async函数的执行,而Promise.then则将函数加入回调链中后继续执行当前函数。

当Promise链抛出未处理的错误时,无论使用await还是Promise.then,JavaScript引擎都需要打印错误信息及其堆栈。然而,两者获取堆栈的方式不同。

使用Promise.then时,JavaScript引擎需要记录并保存堆栈信息。对于V8引擎,它会将堆栈信息附加在Promise上并在Promise链中传递,以便c()函数在需要时获取堆栈信息。

记录堆栈信息需要时间,这会降低性能;而保存堆栈信息需要占用额外的内存。

使用await时,无需存储当前的堆栈信息,因为存储b()到a()的指针就足够了。当等待b()函数执行时,a()函数被暂停了,因此a()函数的作用域还在内存中可以访问。如果b()函数抛出一个错误,堆栈信息可以通过指针迅速生成。如果c()函数抛出一个错误,堆栈信息也可以像同步函数一样生成,因为c()函数是在a()函数中执行的。

Async/Await并非简单的语法糖,它有助于JavaScript引擎处理堆栈的方式更高效且节省内存。

为了优化JavaScript引擎处理堆栈的方式并提高性能,遵循以下建议:

尽量不要使用Babel转码器。所有支持Service Workers的浏览器都支持Async/Await,因此没有必要转码。这一点同样适用于JavaScript modules via script tag。