setTimeout'函数调用最终会杀死JS引擎
Will a recursive 'setTimeout' function call eventually kill the JS Engine?
假设我有一些数据需要每隔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引擎
- 创建GetData函数上下文
- 执行GetData语句,包括"setTimeOut"
- "setTimeOut"指示JS引擎在10秒内调用一个函数
- Destroy GetData函数context 在这一点上,在内存使用方面,我们回到了步骤1。唯一的区别是JS引擎存储了一个函数的引用以及何时调用它(让我们把这个数据称为"futureCall")。
- 10秒后,重复步骤2。"futureCall"被销毁。
相关文章:
- 从js引擎的角度来看闭包和构造函数是如何工作的
- 使用Node.js在应用程序引擎上进行本地单元测试
- 自定义警报/弹出窗口和保持JS引擎
- 敲除js外部模板引擎-没有加载模板
- 具体来说,JS引擎对小写和大写区域设置敏感
- PHP还是JS模板引擎?(对于同一html的多个块)
- 科尔多瓦使用什么js“引擎”
- 使用 V8 JavaScript 引擎在没有 Web 视图的情况下执行 JS 库
- JS引擎何时创建垃圾回收根
- Nodejs4.x上的ES6代码:V8 4.5是一个直接运行ES6的原生JS引擎吗
- 在JavaScript中访问JS引擎日期常量的方法
- js引擎何时插入分号
- 如何访问IE XHTML DOM+JS引擎,而无需启动浏览器本身
- 浏览器javascript兼容系统级js引擎
- 用于2D开发的3D JS引擎
- setTimeout'函数调用最终会杀死JS引擎
- 是否可以在google V8 JS引擎中添加javascript扩展?
- 有安卓内置浏览器开发者指南吗?在哪里查找JS引擎的差异
- 有人能使用Mozilla吗;的Rhino JS引擎
- JDK 1.8.0_92 Nashorn JS引擎indexOf行为