千家信息网

如何理解JavaScript单线程及setTimeout定时器

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,如何理解JavaScript单线程及setTimeout定时器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。理解JavaScript
千家信息网最后更新 2026年11月03日如何理解JavaScript单线程及setTimeout定时器

如何理解JavaScript单线程及setTimeout定时器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

理解JavaScript的单线程的理念对于JavaScript学习,以及掌握其中的一些设计机制非常重要,比如回调、定时器。对于后续学习NodeJS也有很大的帮助。

通过先demo,后总结的形式,使得JavaScript的单线程更易于明白。

1 var a = 1;  //全局变量a 2 function test(){ 3     var a=2;  //test中变量a 4     setTimeout(function(){ 5         alert(a); //输出test中变量a 6         a=3;  //修改test中变量a 7     },3000); 8     a=4; //修改test中变量a 9     setTimeout(function(){ 10         alert(a); //输出test中变量a 11         a=5; //修改test中变量a 12    },1000); 13    alert(a); //输出test中变量a 14 } 15 test(); //执行test函数 16 alert(a); //输出全局变量a  //运行结果:4 1 4 5  /* 结果解析:先输出test()运行结果4,然后输出之后一行代码的1,然后1000ms之后输出test()中的变量a=4,***3000ms之后输出test()中的变量a=5 */  /*   运行机制:      1. JavaScript是单线程,从上往下依次执行      2. setTimeout异步方法存放在任务队列中,JS主线程执行完成之后,才会取任务队列中的任务到JS主线程中执行!       -> 先执行15行,然后执行16行      -> 执行15行,调用test()方法      -> 调用test()方法,先创建一个a变量,然后将***个setTimeout放到setTimeout对应的线程中执行(启动定时器timer),第8行,修改test中变量a为4,然后将第二个setTimeout添加到setTimeout对应的线程队列中执行,执行13行,输出test中变量a,此时为4;然后执行16行,输出全局变量a,此时为1.      -> 1000ms之后,将第二个setTimeout的回调函数,添加到JS任务队列中,3000ms后将***个setTimeout的回调函数,添加到JS任务队列中。      -> JS主线程执行完成之后,会执行任务队列的事件,第二个setTimeout优先进入任务队列,所以优先执行,执行第10行,输出test中的变量a,值为4,然后di11行,将test中的变量a修改为5;2000ms之后***个setTimeout进入任务队列,此时JS主线程栈为空,所以将其添加到JS主线程进行执行,第5行,输出test中的变量a,此时变量的值为5,第6行修改test变量a为3. */

由此延伸以下代码:

var a = 1; var date = +new Date(); // 小技巧:通过"+"转换为整数 function test(){     var a=2;      setTimeout(function(){         console.log(a+'--'+ (new Date()-date));         a=3;        },3000);     a=4;     setTimeout(function(){         console.log(a+'--'+ (new Date()-date));         a=5;    },1000);    console.log(a+'--'+ (new Date()-date)); } while(new Date-date <1000){  } test(); console.log(a+'--'+ (new Date()-date));  //执行结果:4-1000 1-1001 4-2000 5-4001

结合以下博客,整理一些重要概念:

http://www.ruanyifeng.com/blog/2014/10/event-loop.html

http://www.cnblogs.com/Mainz/p/3552717.html

1、作为脚本语言,JavaScript主要功能是与用户互动,以及操作DOM。假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? ->So: JavaScript就是单线程。

2、JavaScript的任务分成两种:同步任务和异步任务。同步任务:在主线程上排队执行的任务,只有上一个任务执行完成了,才会执行下一个任务。异步任务:不进入主线程,而进入"任务队列"的任务,只有"任务队列"通知主线程,某个任务队列可以执行了,等主线程执行完成,任务队列才会进入主线程执行。 -> So:只要主线程空了,就会去读"任务队列",这就是JavaScript的运行机制。

3、主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个事件又叫"事件循环"(Event Loop)。

HTML5规定setTimeout()的第二个参数的最小值(最短间隔),不得低于4ms,如果低于4ms就会自动增加。在此之前,老版本浏览的都将最短时间设置为10ms。另外,对于那些DOM变动(尤其是设计页面重新渲染的部分),通常不会立即执行,而是每16ms执行一次。这是使用requestAnimationFrame()的效果要好于setTimeout()。

4、需要注意的是:setTimeout只是将事件插入"事件队列",必须等到前面代码(执行栈)执行完,主线程才会去执行他指定的回调函数。如果当前代码耗时很长,有可能要等很久,所以并没有办法保证,回调函数一定会在setTimeout()指定的是时间执行。

Javascript是单线程,单线程就意味着所有任务需要排队。然后会将所有任务分成两类:同步任务和异步任务!同步任务:在主线程上执行的任务,只有前一个任务执行完成,才会执行后一个!异步任务:不进入主线程、而进入"任务队列"的任务。

Js是单线程的,但是浏览器是多线程的!浏览器是事件驱动的!

JS运行在浏览器中,是单线程的,每个window一个JS线程,但是浏览器不是单线程。可能有多个如下线程:

Javascript引擎线程、界面渲染线程、浏览器事件触发线程、Http请求线程。

setTimeout可以改变,js执行顺序。比如:我们想要输出Hello World,world必须在hello之后输出,不管我们代码的顺序怎么样都输出同样的效果,这个时候就可以借助setTimeout。

//代码一 var date =  +new Date(); console.log('Hello',new Date()-date); setTimeout(function(){      console.log('world',new Date()-date); },500);  //代码二: var date =  +new Date(); setTimeout(function(){      console.log('World',new Date()-date); },500); console.log('Hello',new Date()-date);  //以上两个代码运行结果一样,结果都是:先输出Hello ,然后500ms之后输出World![实际运行:501ms]

浏览器中定时器也是一个线程!

Javscript是单线程的,ajax请求确实是异步的!原因是ajax请求的时候,是在浏览器的Http请求线程中执行的,执行之后的回调函数会放到Javascript线程中执行!

Summary:

Javascript是单线程的,浏览器是多线程的,浏览器的线程包括:JS引擎线程、界面渲染线程、浏览器事件线程、Http请求线程。不过不同的浏览器提供的线程是有区别的。一般JS引擎线程和界面渲染线程是互斥的,两个线程不能同时执行,否则,就会出现界面渲染线程和JS线程修改同一个DOM样式的矛盾问题!

关于如何理解JavaScript单线程及setTimeout定时器问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

线程 任务 变量 输出 队列 浏览 浏览器 事件 代码 运行 函数 结果 定时器 方法 界面 问题 同步 两个 全局 只有 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市人人互联网科技有限公司 科技赋能下的互联网金融 互联网科技官网 科技平台互联网 鸠鸠互联网科技 北京互联网科技 互联网 科技创新 美国互联网科技 碳银互联网科技有限公司 互联网科技公司介绍 互联网科技英文翻译 天扬科技互联网广告 华脉科技工业互联网产品 花神(南京)互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 开一家科技互联网公司需要多少钱 河南住房之家互联网科技 国大互联网教育科技有限公司薪资 领航科技大厦互联网公司 互联网科技职业技能培训学校 互联网 科技创业 互联网科技媒体 互联网科技的英文 广州互联网络科技有限公司 安控科技rtu产品工业互联网 成都玖崟互联网科技有限公司乐商圈怎么样 昭通互联网科技选哪家 本届互联网博览会上的黑科技 互联网科技资金流入 广西科技产业互联网是什么
0