javascript - JavaScript 中的递归闭包

标签 javascript closures

假设我有类似的东西

function animate(param)
{
    // ...
    if (param < 10)
        setTimeout(function () { animate(param + 1) }, 100);
}

animate(0);

这是否意味着函数的本地数据的每个实例都将保存在内存中,直到 animate 完成,即直到 param 达到 10?

如果实例确实保存在内存中,是否有更好的方法?我知道,将文本代码传递给 setTimeout() 可以解决问题,但在我的例子中,函数参数中的对象不能轻易表示为字符串。

最佳答案

不,在任何给定时间点,函数的本地数据最多有两个实例保存在内存中。这是事件的顺序:

  1. animate(0) 被调用。
  2. 创建了一个带有param == 0 的闭包,它现在阻止释放这个变量。
  3. 超时触发,animate(1) 被调用。
  4. 创建了带有 param == 1 的新闭包,它现在阻止释放此变量。
  5. 第一个闭包执行完毕,此时它不再被引用,可以释放了。来自第一个 animate() 调用的局部变量现在也可以释放。
  6. 从第 3 步开始重复,现在使用 animate(2)

关于javascript - JavaScript 中的递归闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7023518/

相关文章:

javascript:访问闭包中的函数

javascript 闭包规则和作用域链

javascript - 来自 firebase 数据库的聚合值

javascript - 使用 Mongoose 在 Node JS 中进行全文搜索

swift - 通过 self 更新闭包内的 UI 是一种不好的做法吗?

ios - 从 swift 调用 objective-C typedef block

python - 在 Python 中将类实现为字典

包含多个条件的 JavaScript 查找失败

javascript - 如何将 UL/LI 添加到 json2html 解析

javascript - 从 Iframe 触发 Jquery 动画