setTimeout'函数调用最终会杀死JS引擎

Will a recursive 'setTimeout' function call eventually kill the JS Engine?

本文关键字:JS 引擎 函数调用 setTimeout      更新时间:2023-09-26

假设我有一些数据需要每隔10秒从服务器获取一次。我将有一个函数,通过AJAX获取数据,然后调用setTimeout再次调用这个函数:

function GetData(){
   $.ajax({
       url: "data.json",
       dataType: "json",
       success: function(data){
         // do somthing with the data
         setTimeout(GetData, 10000);
      },
      error: function(){
         setTimeout(GetData, 10000);
      }
   });
}

如果一个人让网页整天开着,它可能会得到成千上万的递归函数调用。

我不想使用setInterval,因为它没有考虑到网络延迟。如果网络繁忙并且需要15秒来处理请求,我不想在获得AJAX超时之前再次请求。

处理需要定期调用的函数的最佳方法是什么?

没有实际的递归,因为对GetData的调用被延迟,同时JavaScript上下文被销毁。所以它不会使JS引擎崩溃。

对于您的代码示例,这基本上是在JS引擎级别发生的事情:

    初始化JS引擎
  1. 创建GetData函数上下文
  2. 执行GetData语句,包括"setTimeOut"
  3. "setTimeOut"指示JS引擎在10秒内调用一个函数
  4. Destroy GetData函数context
  5. 在这一点上,在内存使用方面,我们回到了步骤1。唯一的区别是JS引擎存储了一个函数的引用以及何时调用它(让我们把这个数据称为"futureCall")。
  6. 10秒后,重复步骤2。"futureCall"被销毁。