我想在触发事件后调用一个函数,然后在同一个回调中再次调用该函数。这是为了在函数完成时创建一种事件监听器。
当你看到代码时,你就会知道我要做什么:
"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/