您必须知道Javascript知识点的单线程事件驱动。
复制代码代码如下所示:无功intervalbody =函数(){()
console.log(区间);
}
无功startinterval =函数(){()
setInterval(intervalbody,1000);
}
无功timeoutbody =函数(){()
console.log('timeout);
}
无功starttimeout =函数(){()
setTimeout(timeoutbody,1000);
}
var睡眠=函数(第二){
无功电流=新的日期()。SetSeconds(新的日期()GetSeconds()+二);
当(新的日期()<当前){ }
}
StartInterval();
StartTimeout();
睡眠(2);
console.log(睡眠一次);
睡眠(2);
console.log(睡眠了);
结果执行
发生了什么事
规则1
事件驱动单线程模型。所有Javascript代码都是在一个线程中执行的。Javascript线程立即从事件队列中提取一个事件。规则2
除了主机Javascript线程,线程和定时器(setInterval和setTimeout将触发执行的两个线程),浏览器事件触发线程(线程将触发onclick,移动鼠标和其他浏览器事件),Ajax请求线程;所有这些线程触发事件(回调)将被添加到事件队列3条尾巴。
当浏览器加载HTML文档时,它将把当前HTML的所有js代码作为事件队列的第一个事件,并且其他线程触发的事件将被添加到事件队列的尾部。
规则4
在setTimeout和setInterval回调函数的执行时间是绝对大于指定了浏览器的渲染线程的秒数。
如果Javascript的执行线程执行一个事件,在修改DOM DOM实现过程的一个事件,这些更改不会立即对界面反应,但当一个事件的Javascript执行完毕后,线程会被阻塞,当渲染DOM浏览器渲染线程将修改结果,如浏览器渲染线程执行完毕后,Javascript线程继续运行。
代码示例
复制代码代码如下所示:
var睡眠=函数(第二){
无功电流=新的日期()。SetSeconds(新的日期()GetSeconds()+二);
当(新的日期()<当前){ }
}
= '光' document.body.innerHTML段;
睡眠(5);