假设我有类似的东西
function animate(param)
{
// ...
if (param < 10)
setTimeout(function () { animate(param + 1) }, 100);
}
animate(0);
这是否意味着函数的本地数据的每个实例都将保存在内存中,直到 animate 完成,即直到 param 达到 10?
如果实例确实保存在内存中,是否有更好的方法?我知道,将文本代码传递给 setTimeout()
可以解决问题,但在我的例子中,函数参数中的对象不能轻易表示为字符串。
最佳答案
不,在任何给定时间点,函数的本地数据最多有两个实例保存在内存中。这是事件的顺序:
animate(0)
被调用。- 创建了一个带有
param == 0
的闭包,它现在阻止释放这个变量。 - 超时触发,
animate(1)
被调用。 - 创建了带有
param == 1
的新闭包,它现在阻止释放此变量。 - 第一个闭包执行完毕,此时它不再被引用,可以释放了。来自第一个
animate()
调用的局部变量现在也可以释放。 - 从第 3 步开始重复,现在使用
animate(2)
。
关于javascript - JavaScript 中的递归闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7023518/