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

标签 javascript stack-overflow

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

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

"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);
}); 

问题:

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

谢谢!

最佳答案

Could this potentially cause a stack overflow?

不会,不会造成栈溢出。当堆栈完全展开时调用异步回调,因此没有堆栈堆积。

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

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

回调函数会有一个事件范围对象,但在 Javascript 中范围与堆栈框架完全分开。

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

Is there a way to refactor this code to not be recursive?

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

关于javascript - 从回调中递归调用函数会导致堆栈溢出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37971769/

相关文章:

javascript - 不同域的 iframe 跟踪不一致

javascript - 对象之间的指针行为

html-agility-pack - 解决StackOverflowException

java - 为什么快速排序的 JDK 实现有堆栈溢出的风险?

java - 使用 Java 递归分解,处理 StackOverflow

javascript - 如何计算可见高度?

php - 使用 php 或 javascript 查看它是否为 "my iPad"

javascript - 仅当图像 url 存在时,如何在 Vue.js 中显示 <img>?

c++ - 在 C++ 中增加堆栈大小

javascript - Bootstrap 4 JS 在 SO Embed Snippet Fiddle 上抛出错误