setTimeout/setInterval和内存管理

171 阅读1分钟

定时器的用法

  1. setTimeout 在一段时间后执行一次回调任务
  2. setInterval 每隔N秒执行回调任务
  3. 定时器返回一个正整数(编号),在编号池中关联对应定时器对象,以便于clearTimeout清除
  4. setTimeout和setInterval共享一个编号池
  5. 在同一个对象上(一个 window 或者 worker),setTimeout()或者setInterval()在后续的调用不会重用同一个定时器编号。但是不同的对象使用独立的编号池。

定时器参数

  • func 回调函数
  • delay 时间
  • (可选)传递给func使用的参数arg1,arg2...

内存管理

  1. 在js的垃圾回收机制中,不再被程序引用的变量内存会在一定周期内被回收
  2. 所以我们通常使用 xx = null 的方式表示变量可以被回收
  3. 但定时器返回的id只是Number类型 对它的置空null是无效的,定时器对象的清空需要通过clear

代码结论

function timeout() {
    var timeId = setTimeout(() => {
        console.log(timeId);
        timeout();
    }, 4);
}
timeout();
  • 结论:通过浏览器的任务管理器和memory查看 setTimeout内存增速较缓,内存回收机制有效。
function timeout() {
    var timeId = setTimeout(() => {
        console.log(timeId);
        timeout();
    }, 4);
}
timeout();
  • 结论:替换成setInterval,页面内存快速增加、正常刷新无效,只能通过清除缓存刷新和关闭当前页面