We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JS单线程原因:如果多线程,那么删除或者创建dom元素,都需要在线程之间通信。因为浏览器不确定dom状态。所以,js设计之初就是单线程。 好处:简单,没有线程切换维护开销,省内存。
浏览器一般至少实现三个常驻线程:JS引擎线程,GUI渲染线程,浏览器事件触发线程。
JS引擎的工作机制是:当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等JS引擎空闲才会执行,但死循环是永远不会空闲的,所以setTimeout也永远不会执行。
一道面试题:js中在一个时间节点执行
var startTime = +(new Date()),endTime; setTimeout(function(){ endTime = +(new Date()); console.log(1); console.log(endTime - startTime); },3000); setTimeout(function(){ endTime = +(new Date()); console.log(2); console.log(endTime - startTime); },2000); while(+(new Date()) - startTime < 5000){} console.log(+(new Date()) - startTime);
请问alert(1)和alert(2)的先后顺序和时间间隔。
5s钟的同步执行完之后,开始执行setTimeout异步代码,因为第二个插入的时间间隔早,先执行。 因为5s时间超过了3s,所以两个函数几乎同时执行。如果同步时间是1s,那就是2s之后执行第二个函数,3s后执行第一个函数。
setTimeout(..) 并没有把你的回调函数挂在事件循环队列中。它所做的是设 定一个定时器。 当定时器到时后,环境会把你的回调函数放在事件队列中,如果这时候事件循环中已经有 20 个项目了会怎样呢?你的回调就会等待,定时器只能确保你的回调函数不会在指定的 时间间隔之前运行,但可能会在那个时刻运行,也可能在那之后运行,要根据事件队列的 状态而定(PS: 这就是造成定时器不准确的缘由)。
setTimeout(..0)(hack)进行异步调度,基本上它的意思就是把这个函数插入到当前事件循环队列的结尾处。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
单线程的JS引擎
JS单线程原因:如果多线程,那么删除或者创建dom元素,都需要在线程之间通信。因为浏览器不确定dom状态。所以,js设计之初就是单线程。
好处:简单,没有线程切换维护开销,省内存。
多线程的浏览器
浏览器一般至少实现三个常驻线程:JS引擎线程,GUI渲染线程,浏览器事件触发线程。
JS引擎的工作机制是:当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等JS引擎空闲才会执行,但死循环是永远不会空闲的,所以setTimeout也永远不会执行。
一道面试题:js中在一个时间节点执行
请问alert(1)和alert(2)的先后顺序和时间间隔。
5s钟的同步执行完之后,开始执行setTimeout异步代码,因为第二个插入的时间间隔早,先执行。
因为5s时间超过了3s,所以两个函数几乎同时执行。如果同步时间是1s,那就是2s之后执行第二个函数,3s后执行第一个函数。
setTimeout(function(){},0)
setTimeout(..) 并没有把你的回调函数挂在事件循环队列中。它所做的是设 定一个定时器。
当定时器到时后,环境会把你的回调函数放在事件队列中,如果这时候事件循环中已经有 20 个项目了会怎样呢?你的回调就会等待,定时器只能确保你的回调函数不会在指定的 时间间隔之前运行,但可能会在那个时刻运行,也可能在那之后运行,要根据事件队列的 状态而定(PS: 这就是造成定时器不准确的缘由)。
setTimeout(..0)(hack)进行异步调度,基本上它的意思就是把这个函数插入到当前事件循环队列的结尾处。
The text was updated successfully, but these errors were encountered: