携手创作,共同成长!这是我参与「掘金日新计划 · 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..); 后面的参数作为回调函数的参数
打印信息: 4,6
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); 两个参数 执行函数/函数名,推迟时间
打印信息:7,7,7,7,7,7.....
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();