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
// 在 WorldsetInterval
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。
限制来源于“上古时代”。