如果我想设计这样一个函数sleep(time),该函数执行效果是令js引擎进入为期为time的睡眠,睡眠结束后再继续执行任务
但是由于JS引擎是单线程的,它是个勤奋的急性子:有什么任务分配给他他就一定要做完才休息。所以我们为了达到实现"睡眠"的目的,有两种方法
- 同步方法:"假休眠",让js一直"执行任务"。在time时间内JS一直做"看表等待"。直到time结束才开始干正事
function sleep(seconds, fn){
setTimeout(fn, seconds * 1000)
}
console.log(1)
sleep(3, ()=> console.log('wake up'))
- 异步方法:"真休眠",js让浏览器定一个time后响的闹钟,闹钟响后才开始给js分配任务。在time时间那段内由于js没有被分配任务,就会乖乖休息。
function sleep(seconds){
var start = new Date()
while(new Date() - start < seconds * 1000){
}
return
}
console.log(1)
sleep(3)
console.log('wake up')
回到最开始,我们为什么要让js睡一会儿呢?其实这是无奈之举,js确实很勤劳,是个急性子,但当分配给它的任务需要某种资源,而这种资源又需要一段时间才能拿到时,我们就必须设置闹钟,资源到位后再把该项任务分配给js
- 一道涉及词法树和异步的面试题
let liList = document.querySelectorAll('li')
for(var i=0; i<liList.length; i++){
liList[i].onclick = function(){
console.log(i)
}
}
关键:js识别i(判断i的值)是在闹钟响起前还是后?
不会看这里
网友评论