Node.js:异步函数中的尾部调用是否有优化?
我使用的是节点v8.10.0Node.js:异步函数中的尾部调用是否有优化?,node.js,recursion,tail-recursion,Node.js,Recursion,Tail Recursion,我使用的是节点v8.10.0 上面的问题解释了Node.js如何不再支持TCO。我最近遇到了一个类似这样的函数的问题: async function processBatch(nthBatch) { // do a bunch of async work and build up variables await processBatch(nthBatch + 1); } 该代码存在内存泄漏,通过将其更改为: async function processBatch(nthB
async function processBatch(nthBatch) {
// do a bunch of async work and build up variables
await processBatch(nthBatch + 1);
}
该代码存在内存泄漏,通过将其更改为:
async function processBatch(nthBatch) {
// do a bunch of async work and build up variables
return processBatch(nthBatch + 1);
}
我感到惊讶的是,这实际上起了作用,因为在上面描述的问题中,它清楚地解释了在Node8.x中不支持TCO。那么,在这里是否有一些特殊的事情可以实现TCO?或者是因为它在引擎盖下使用发电机,返回标记发电机已完成,因此可以丢弃堆栈
async function processBatch(nthBatch) {
// do a bunch of async work and build up variables
await processBatch(nthBatch + 1);
}
此代码段导致内存泄漏,因为无法对注释中声明的变量进行垃圾收集,因为解释器不知道不再需要这些变量。e、 g.解释器当时不知道wait
后面没有一行可能需要所有声明变量
async function processBatch(nthBatch) {
// do a bunch of async work and build up variables
return processBatch(nthBatch + 1);
}
在本例中,返回函数,因此垃圾收集器可以安全地清理方法中声明的变量。请注意,堆栈仍然存在,如果此递归函数的迭代次数过多,将抛出超过最大调用堆栈大小的错误,但是声明的变量在堆中活动,因此可以在保持堆栈信息完整的情况下进行垃圾收集