首页 » PHP教程 » phpajaxsettimeout技巧_JS中的setTimeout和setInterval黑魔法

phpajaxsettimeout技巧_JS中的setTimeout和setInterval黑魔法

访客 2024-12-14 0

扫一扫用手机浏览

文章目录 [+]

Javascript之setTimeout

基本用法

根据W3C的标准阐明,setTimeout是定义一个在指定时间后触发的函数。

phpajaxsettimeout技巧_JS中的setTimeout和setInterval黑魔法

我们先来看看setTimeout的基本用法,实现这样一个大略的效果,点击一个button,在3秒后页面上的笔墨消逝。

phpajaxsettimeout技巧_JS中的setTimeout和setInterval黑魔法
(图片来自网络侵删)

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的大略比较,大家学会了吗?

标签:

相关文章

大数据赋能排单,智能时代的物流革新之路

在当今这个信息化、数据化的时代,大数据已经成为各行各业转型升级的重要驱动力。在物流行业,大数据的应用更是推动了排单模式的革新,实现...

PHP教程 2024-12-16 阅读0 评论0

大数据赋能早筛,精准医疗的未来之路

随着医疗科技的飞速发展,精准医疗逐渐成为行业共识。在众多精准医疗技术中,大数据早筛技术以其高效、精准、便捷等优势,备受关注。本文将...

PHP教程 2024-12-16 阅读0 评论0

大数据赋能时代,驱动社会发展新引擎

随着互联网技术的飞速发展,大数据时代已经悄然来临。大数据作为一种新型资源,正以其巨大的潜力,为各行各业带来深刻的变革。在我国,大数...

PHP教程 2024-12-16 阅读0 评论0