从回调中递归调用函数会导致堆栈溢出吗?

2024-04-24

我想在事件触发后调用一个函数,然后在同一个回调中再次调用该函数。这是为了在函数完成时创建一种事件侦听器。

当你看到代码时你就会知道我想做什么:

"use strict";
var page = require('webpage').create();
var system = require('system');

function onStdReadLine(callback) {
    system.stdin.readLineAsync(function(err, line) {
        callback(line);
        onStdReadLine(callback);
    });
}

onStdReadLine(function(line) {
    // do something when the line comes in
    system.stdout.writeLine(line);
}); 

问题:

这可能会导致堆栈溢出吗?有没有办法重构这段代码使其不递归?

Thanks!


这可能会导致堆栈溢出吗?

不会,不会导致堆栈溢出。当堆栈完全展开时,将调用异步回调,因此不会出现堆栈堆积。

记住异步操作是如何工作的。 Javascript 的当前线程启动异步操作。然后,该异步操作由其他一些本机代码管理。然后,Javascript 的当前线程运行至完成并结束(从而清除堆栈)。

一段时间后,运行异步操作的本机代码发现该操作已完成,并将事件发布到 Javascript 事件队列以调用该异步操作的回调。当 JS 引擎没有运行任何其他内容时,它将将该事件从队列中拉出并处理它(调用回调)。当它调用回调时,它将有一个空的堆栈帧。

回调函数将有一个活动作用域对象,但在 Javascript 中,作用域与堆栈框架完全分开。

唯一可能出现问题的情况是您的回调曾经被同步调用过。然后,显然会出现堆栈堆积和堆栈溢出的可能性。但是,只要回调始终是异步调用的(应该​​是这样),那就没有问题。

有没有办法重构这段代码使其不递归?

在 Javascript 异步编程中,这是一种非常有用的设计模式,从上一次迭代完成后运行某些内容的下一次迭代,并从其中调用函数是这样做的常用方法。没有理由重构它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从回调中递归调用函数会导致堆栈溢出吗? 的相关文章