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。