Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js:异步函数中的尾部调用是否有优化?_Node.js_Recursion_Tail Recursion - Fatal编程技术网

Node.js:异步函数中的尾部调用是否有优化?

Node.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

我使用的是节点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(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);
}
在本例中,返回函数,因此垃圾收集器可以安全地清理方法中声明的变量。请注意,堆栈仍然存在,如果此递归函数的迭代次数过多,将抛出
超过最大调用堆栈大小的
错误,但是声明的变量在堆中活动,因此可以在保持堆栈信息完整的情况下进行垃圾收集