定时器是浏览器环境下,顶层对象window身上的两个方法,它们会向任务队列中添加任务
1、setInterval 重复执行定时器;
2、setTimeout 延迟执行定时器;
语法:setInterval/setTimeout(函数,时间,函数实参...)
参数1:
1、可以是直接执行的代码,但需要放在引号内(js内部会用eval把字符串转成真正代码);
setTimeout('console.log("第一个参数为一条代码,要放在引号里面")',500);
2、可以是function声明的函数,也可以是个函数名;
setTimeout(()=>console.log('第一个参数是一个函数体'),500);
const fn=()=>console.log('第一个参数是一个函数名')
setTimeout(fn,500);
参数2:
1、单位为毫秒(ms),1s=1000ms,省略默认为浏览器规定的最小间隔时间;
2、最大值为2147483647ms(24.8天),超过的话等同于0;
3、一般这个值给16左右(一般屏幕刷新频率为60Hz,会每秒重绘60次,1000ms/60≈16.7ms)屏幕分辨率->高级设置->监视器中查看和设置);
参数3:
1、如果第一个参数里是function声明的函数,那从第三个参数开始就是这个函数的实参,参数个数与形参一致;
2、IE6789不支持第三个参数,但不会报错,参数为undefined;
setTimeout((name,age)=>console.log('我的名字叫:'+name+';年龄为:'+age),500,'kaivon',18);
作用
改变事件冒泡的顺序
点击
const input=document.querySelectorAll("input")[0],
btn=document.querySelector("button");
btn.οnclick=function(){
setTimeout(()=>input.value+=' button',0);
};
document.body.οnclick=function(){
input.value+=' body';
};
解决键盘事件造成的问题
点击
const input1=document.querySelectorAll("input")[1]
input1.οnkeydοwn=function(){
//console.log(this.value);
setTimeout(()=>console.log(this.value),0);
}
我们发现如果不用定时器的时候,点击按钮打印的都是上一次输入的内容,原因是事件发生的速度非常的快,比浏览器接受的内容还快。意思就是当我们输入内容,点击按钮的时候,浏览器还没接收到数据,事件就发生了。所以永远取的都是上一次的内容。获取但当我们加入定时器的时候,就能准确的打印我们当下输入的内容,原因是定时器是在上一次事件循环才执行的,到第二次循环的时候,页面肯定能接收到内容了。