setTimeout用法 & 任务队列异步函数节流
2019-03-18 本文已影响0人
antimony
第 1 题:下面这段代码输出结果是? 为什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
结果:
1
3
2
原因:因为 setTimeout 指定的函数必须等到本次执行的所有代码都执行完才会执行。
setTimeout和setInterval的运行机制是,将指定的代码移出本次执行,等到下一轮Event Loop时,再检查是否到了指定时间。如果到了,就执行对应的代码;如果不到,就等到再下一轮Event Loop时重新判断。这意味着,setTimeout指定的代码,必须等到本次执行的所有代码都执行完,才会执行。
下面这段代码输出结果是? 为什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
不会进行输出。因为先执行死循环不进入下一次Event Loop。
实现一个节流函数。
var timer;
function hiFrequency(){
if(timer){//假如已经在计时那么久先清除计数器
clearTimeout(timer)
}
timer = setTimeout(function(){
console.log('do something')
}, 300)
}
hiFrequency()
hiFrequency()
hiFrequency()
简单解释单线程、任务队列的概念。
单线程:相当于只有一个人做事,而不是多人合作。一个人一个一个地执行任务,其他任务都必须在后面排队等待。不会出现多人可能同时做了一个任务并且同时执行完成但结果又不同的复杂情况。
任务队列:主线程全部执行完成之后就会查看任务队列里的异步任务,满足条件时就执行。