Javascript之setTimeout
基本用法根据W3C的标准阐明,setTimeout是定义一个在指定时间后触发的函数。
我们先来看看setTimeout的基本用法,实现这样一个大略的效果,点击一个button,在3秒后页面上的笔墨消逝。

setTimeout基本用法
由于这段代码非常根本,这里不做过多讲述。
setTimeout(fn, 0)上面一部分说到setTimeout是相称于给函数定义一个‘闹钟’,当到了指定的韶光后就会自动实行函数。但是如果我们将韶光设置为0,即涌现setTimeout(fn, 0)这样的代码,情形是怎么样的呢?是会立即实行吗?
我们可以通过以下一段代码来进行测试。
测试代码
如果和我们预测的一样,立即实行的话,上面的测试代码会按照1 > 2 > 3的顺序输出,但是实际运行后,我们创造输出结果的顺序为1 > 3 > 2,而且不管运行多少次结果都不变。
涌现了这样的结果,就证明了setTimeout(0)并不是立即实行的,那这又该怎么阐明呢?
JS单线程实行为理解释上面这个问题,我们要追溯到JS实行过程,我们都知道JS是单线程实行,所有的异步事宜,包括自定义的页面DOM事宜,定时器,Ajax要求都会被添加到一个任务列表按照顺序实行。
由于JS脚本文件是运行在浏览器真个,我们的JS引擎虽然是单线程的,但是对付浏览器来说确是多线程的。浏览器中不仅包括JS引擎,还包括网络要求Ajax,浏览器渲染等,它们都有特定的线程去实行。
setTimeout并不能作为多线程利用,可以通过以下一段代码来证明。
测试代码
对付以上一段代码,如果setTimeout可以作为多线程利用,则新的线程会在一秒后将isEnd属性设置false,那么在一秒后会alert出end字符串。
但是实际情形确是,页面从未打印出end字符串,而且页面会呈现锁去世状态,这是由于isEnd变量值并未修正为false,相称于实行while(true),终极页面会崩溃。这也就能证明JS引擎是单线程实行状态。
事宜行列步队既然JS引擎是单线程实行,那么setTimeout定义的事宜该详细何时触发呢?
这里我们须要深入到浏览器内核设计,在内核中涉及到一个事宜行列步队的观点,我们可以直接看如下这张图。
事宜行列步队
从上面这张图很随意马虎看出,在浏览器内核中包含了各式各样的线程,有浏览器GUI渲染线程,Javascript引擎线程,网络要求线程。
在当JS引擎实行到其他线程干系的代码时,就会实行其他线程的代码,在其他线程实行完毕后须要JS引擎重新运行时,就会在JS引擎的事宜行列步队里添加一个任务。
现在我们来看看setTimeout(0)做了什么?它会开启一个定时器线程,并不会影响后续的代码实行,这个定时器线程会在事宜行列步队后面添加一个任务,例如上面图中的t3。等到前面的t1,t2实行完后再去实行t3,因此在前面第二部分内容中的输出顺序为1 > 3 > 2。
setInterval既然说到了setTimeout,就不得不提到setInterval,setInterval同样作为一种定时器,是在指定的韶光间隔后实行相应的函数。
一种最常见的场景是页面上的倒计时实现。这里我们实现一个大略的效果,指定一个韶光,并进行倒计时。
倒计时
比拟setTimeout与setInterval虽然都是定时器,但是在实行上还是有不一样的。
setTimeout是指定的韶光后实行一次;setInterval是在每隔指定的韶光后实行多次。
setTimeout(fn1, t1),fn1的实行韶光是大于或即是t1的;setInterval(fn2, t2),fn2的实行会始终考试测验在t2韶光后实行,如果网络要求较大的话,会涌现fn2连续实行的情形。
总结本日这篇文章紧张讲解了Javascript中的setTimeout用法和实行事理,以及与setInterval的大略比较,大家学会了吗?