使用回调执行异步操作会增加堆栈大小吗?我没有足够的javascript解释器知识或适当的工具来解决这个问题。我的goto工具是firebug控制台,它显示堆栈大小没有增加,但我可能看错了。有人知道吗?
答案 0 :(得分:5)
异步回调就像事件回调一样,通过事件循环逐个运行。它不会从函数的同一个调用堆栈中调用,因为循环中的每个函数都会在调用next之前运行完成。所以不,他们不会增加堆栈大小。
答案 1 :(得分:4)
我相信现代浏览器中的所有javascript引擎都是单线程的,这意味着在当前执行路径结束之前,回调实际上不会发生。这意味着堆栈已完全展开,回调将(基本上)与新堆栈一起发生。
只有在调用函数或声明局部变量时,堆栈大小才会增加。当您离开导致增加的范围时,堆栈将再次减小。
如果你对整体内存使用更感兴趣,那就有点复杂了。
回调将占用一些内存,直到它们被执行但javascript引擎应该在回调完成后自行清理。如果你将新数据放在堆上(例如通过全局变量),那么该内存将不会被释放,因为它在回调后仍然会被使用。