从JS引擎理解Await 与.then()的堆栈处理
发布网友
发布时间:2024-10-01 08:04
我来回答
共1个回答
热心网友
时间:2024-10-13 19:12
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 moles via script tag。