javascript - 在闭包中调用 setTimeout 会导致内存泄漏吗?

标签 javascript callback timeout closures settimeout

我有一个第三方 JavaScript 对象,我在该对象上调用“搜索”方法并传入搜索查询字符串以及搜索完成后执行的函数。这个第三方对象然后消失并尝试从服务中检索数据。如果服务调用未能在 10 秒内返回,第三方对象会记录超时错误,但遗憾的是不会执行状态为“超时”或其他适用状态的回调函数。

为了在超时时执行回调,我按照以下代码包装了第三方对象调用:

var SEARCH_TIMEOUT_MILLISECONDS = 10500;

var thirdPartyObject = ... // Global variable

function search(searchTerm, onCompleteCallback) {

    var searchTimeoutHandler = setTimeout(function () {
        onCompleteCallback(null, 'TIMEOUT');
    }, SEARCH_TIMEOUT_MILLISECONDS);

    thirdPartyObject.search({
        searchTerm: searchTerm,
        onComplete: function (searchResponse, status) {

            clearTimeout(searchTimeoutHandler);

            onCompleteCallback(searchResponse, status);
        }
    });
}

在创建闭包的地方,如果这个函数被调用了数百次(有些是并发的),在调用或不调用 setTimeout 函数的场景中是否会出现内存问题?

最佳答案

不,不应该有任何内存泄漏。关于超时只有两种情况:

  • 调用超时处理程序,之后它被垃圾收集。
  • 超时被清除,之后它也被垃圾收集。

但是,如果您进行了数百次多次搜索,这些超时处理程序可能会堆积起来,但它们最终会被清除(最多花费 n * SEARCH_TIMEOUT_MILLISECONDS 之后,其中 n 是调用 search 的次数,这也是您将拥有的超时处理程序的实例数)。所以本身没有内存泄漏,但你可以让事情堆积起来。您可能需要调整 SEARCH_TIMEOUT_MILLISECONDS 变量,这样您就不会堆积任何东西。您还可以在 Chrome 开发者工具上查看内存使用情况,了解有多少内存已用完。

关于javascript - 在闭包中调用 setTimeout 会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865648/

相关文章:

javascript - 普通 javascript beforeSend 和成功

javascript - 从 YouTube 缩略图抓取调色板

ruby-on-rails - 从 Ruby 类中调用方法? (或者这是 Rails 的魔法)

callback - 使用 plotly express 并在一页上有多个图形时,随机出现导入错误

javascript - 清除setTimeout

javascript - 通过 phpmailer 发送电子邮件不会返回 Javascript 响应

javascript - codePointAt 和 charCodeAt 的区别

javascript - Node.js 回调混淆 - MongoDB 的 findOne() : Why is this permitted? 的第三个参数

PHP 上传超时 : More Efficient Upload Script?

ruby-on-rails - 如何在可配置的超时时间内响应 Rails 请求