JS定时器和单线程异步特性
程序员文章站
2022-05-28 12:54:42
首先要说的是,定时器相关的方法都是属于BOM方法,而定时器呢,它是用于在设定的时间执行一段代码,或者在给定的时间间隔内重复该代码。具体函数: 定时器确实很好用,但是却又不好用,为什么这么说呢?我们知道JS是单线程的,既然是单线程那么就很容易出现线程被堵塞的情况,怎么解决呢?——异步!当然JS是单线程 ......
首先要说的是,定时器相关的方法都是属于BOM方法,而定时器呢,它是用于在设定的时
间执行一段代码,或者在给定的时间间隔内重复该代码。具体函数:
setTimeout(callback, delay);//delay一定的时间后,执行回调函数只执行一次 setInterval(callback, delay);//每隔一段时间执行一次callback,反复执行 clearInterval(timer);//清除定时器
定时器确实很好用,但是却又不好用,为什么这么说呢?
我们知道JS是单线程的,既然是单线程那么就很容易出现线程被堵塞的情况,怎么解决
呢?——异步!
当然JS是单线程的它本身是不能异步的,但JS的宿主环境(比如浏览器,node)是多线程
的,宿主环境通过某种方式(比如:node的事件驱动)使得JS具备了异步的特性。
为什么突然谈起JS的单线程异步呢?因为定时器事件会被JS异步处理,什么意思?
用代码来说:
1 var num = 1; 2 setTimeout(function() { 3 num++; 4 console.log(num); 5 }, 1000); 6 console.log(num); //结果并是不(2,1)而是(1,2)
为什么会这样?前面说过了,JS会把定时器事件异步处理,也就是说它并不会等待定时器事件
处理完成后再执行下面的代码,而是直接将定时器事件插入到事件队列当中后,直接执行下面
的代码,当定时器事件执行完成后JS再反过头来执行定时器事件的回调部分代码,这就是异步!
异步可以有效的防止JS线程被堵塞,且会有很高的效率,能够使JS在有限的资源下做更多的事
情,这一点是很了不起的。(node中我们会大量接触关于异步的问题)