js中setTimeOut,setInterval的区别

208 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

1.setTimeout()

1.1 基本语法

setTimeout:延迟一段时间执行函数,只执行一次

setTimeout(func|code, delay); 两个参数 执行函数/函数名,推迟时间

console.log(1);
setTimeout(() => { console.log(2) }, 1000);

1.2setTimeout 许添加更多的参数

setTimeout(func|code, delay, data1,data2..); 后面的参数作为回调函数的参数

打印信息: 46
function f(a, b) {
     console.log(a, b)
 }
setTimeout(f, 1000, 4, 6);


打印信息:10
setTimeout((a, b) => {
    console.log(a + b)
}, 1000, 4, 6);

1.3回调函数是对象的方法,this指向全局

2.setInterval()

2.1 基本语法

setInterval:每隔一段时间执行一次,无限次的定时执行

setInterval(func|code, delay); 两个参数 执行函数/函数名,推迟时间

打印信息:777777.....
setInterval(() => {
console.log(7)
}, 1);

 

3.执行机制

setTimeout,setInterval的运行机制,是将指定的代码移出本轮事件循环,等到下一轮事件循环,再检查是否到了指定时间。如果到了,就执行对应的代码;如果不到,就继续等待 。

setTimeout,setInterval指定的回调函数,必须等到本轮事件循环的所有同步任务都执行完,才会开始执行。由于前面的任务到底需要多少时间执行完,是不确定的,所以没有办法保证,setTimeout和setInterval指定的任务,一定会按照预定时间执行。

 

4.清除定时器

function fun(){
 alert('hello');
  }
 var t1 = setTimeout(fun,1000);
 var t2 = setInterval(fun,1000);
 clearTimeout(t1);
 clearInterval(t2);

5.用setTimeout实现setInterval的功能

使用递归循环调用实现 可以实现同样的功能,但有运行方面有差别: 比如延时1s执行函数fun(),但是函数内部的操作执行需要的时间是2S,由于JavaScript是单线程的,那在这次执行完之前,下一次的循环便被阻塞了,处在排队的状态,当此次操作执行完以后才会执行处在排队状态的操作, 但是排队的序列太多,阻塞结束以后只能执行一个,这样会造成性能的浪费, 所以在这样的情况下,使用setTimeout递归调用实现循环的方法便显得很方便,它不会发生阻塞的状况 比如函数内部的执行需要2S,那setTimeout会等2S执行完以后才去递归调用,也就是说整个一次循环需要3S的时间。 但是setTimeout又不如setInterval执行的精确,所以在不同情况下可以选择不同的定时器以达到最好的效果。

function fun() {
console.log(1)
s = setTimeout(fun, 1000);
}
fun();