递归的'setTimeout'函数调用最终会杀死JS引擎吗?

时间:2011-07-21 16:37:08

标签: javascript recursion settimeout

假设我每隔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超时之前再次询问它。

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

1 个答案:

答案 0 :(得分:23)

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

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

  1. 初始化JS引擎
  2. 创建GetData函数上下文
  3. 执行包含“setTimeOut”
  4. 的GetData语句
  5. “setTimeOut”指示JS引擎在10秒内调用函数
  6. 销毁GetData函数上下文
  7. 此时,就内存使用而言,我们又回到了第1步。唯一的区别是JS引擎存储了对函数的引用以及何时调用它(让我们调用这个数据“futureCall”)。 / LI>
  8. 10秒后,从步骤2开始重复。“futureCall”被销毁。