【发布时间】:2015-07-27 15:18:13
【问题描述】:
假设,例如,您正在编写一个程序,该程序等待队列中的一条消息,处理它,然后等待下一条消息,这样一直持续下去。在像 C 或 Java 这样的语言中,它看起来像这样:
void processMessage() {
while (true) {
// waitForMessage blocks until the next message is received
msg = waitForMessage();
// handle msg here
}
}
在Javascript中(我使用的是node.js,顺便说一句),因为使用了回调,它通常看起来像这样:
function processMessage() {
waitForMessage(function(msg) {
// handle msg or error here
processMessage();
});
}
我担心的是你基本上有一个递归调用原始函数的回调链,这样做的开销可能会慢慢消耗内存。我猜这实际上不是问题,因为javascript回调可能独立存在于它们自己的堆栈中并且没有被推送到原始函数的堆栈中?有人向我解释了 javascript 回调和范围,并向我保证 javascript 代码在运行任意长的时间同时接收任意大量的消息时不会耗尽内存
【问题讨论】:
-
这并不是真正的递归,因为当触发异步事件发生时,每个回调都会在新堆栈上调用。换句话说,第一次调用
processMessage()将在下一次响应事件发生时完成。 -
如果您设置了应该运行多次的情况,您将能够在 chrome 检查器中看到这一点。我的猜测是,只要您完成每个回调的过程,就不应该有问题
标签: javascript node.js recursion memory-leaks callback