Skip to content

setTimeout / setInterval

“计划调用(scheduling a call)” 等待特定时间再执行。

setTimeout 和 setInterval 这两个方法并不在 JavaScript 的规范中,但是都可以放心使用。

setTimeout

let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)

delay 执行前的延时,以毫秒为单位,默认值是 0;
1 秒 = 1000 毫秒

setTimeout 期望得到一个函数的引用!不是函数执行!!

node 的 setTimeout 的返回与 浏览器的不太一样,不过都可以正常使用。

clearTimeout

clearTimeout 用于取消 setTimeout

js
let timerId = setTimeout(...);
clearTimeout(timerId);

setTimeout 0

setTimeout(func, 0),或 setTimeout(func) 并不是脱了裤子放屁

这会将 func 安排在 calendar 中,calendar 需要在当前行数执行完才会去检查。

js
setTimeout(() => console.log("World"));

console.log("Hello");

// 先 Hello
// 在 World

setInterval

let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)

gc

setTimeout 和 setInterval 的函数不会被 gc 回收。

如果 func 闭包外部引用,它也不会被 gc 回收。

当不在使用后,应该立刻取消,避免内存消耗。

限制

“经过 5 重嵌套定时器之后,时间间隔被强制设定为至少 4 毫秒”

这个限制仅在浏览器

js
let start = Date.now();
let times = [];

setTimeout(function run() {
  times.push(Date.now() - start); // 保存前一个调用的延时

  if (start + 100 < Date.now()) alert(times); // 100 毫秒之后,显示延时信息
  else setTimeout(run); // 否则重新调度
});

// 输出示例:
// 1,1,1,1,9,15,20,24,30,35,40,45,50,55,59,64,70,75,80,85,90,95,100

前面 4 次都是 1,说明 delay 是 0 , 后面开始 强制 delay。

限制来源于“上古时代”。