问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何理解setTimeout里面的异步

发布网友 发布时间:2022-05-03 04:51

我来回答

2个回答

懂视网 时间:2022-05-14 21:17

都是一些很基础但是很容易被忽视的问题,大家知道这个方法怎么使用但是并没有深入研究到底是怎么一个流程,废话不多说,看下面的代码

 <input type="text" value="a" name="input" onkeydown="alert(this.value)" />
<input type="text" value="a" name="input" onkeydown="var me=this;setTimeout(function(){alert(me.value)},0)" >

第一个keydown的时候,弹出来的是input里原来的value,而第2个在keydown的时候,却能弹出更新后的value,就是因为setTimeout,虽然他的delay设置为0,几乎是即时触发,但还是被添加到了执行队列后面,但就是这个异步过程,渲染已经完成了,当他回调函数执行时,输出来的已经是更新后的value了。这里还有一个问题是this在不同的function的内外部所指示的不同对象的问题,当function里还有function的时候 多多注意this,很容易出错误,细心就好,不多说。

接下来讲一下,js js是单线程的,可想而知,如果没有多线程的话,整个程序就卡死了,幸好浏览器是多线程的,浏览器使得js具备异步的一些属性:js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。

浏览器为网络请求这样的异步任务单独开了一个线程,那么问题来了,这些异步任务完成后,主线程怎么知道呢?答案就是回调函数,整个程序是事件驱动的,每个事件都会绑定相应的回调函数,举个栗子,有段代码设置了一个定时器

setTimeout(function(){
 console.log(time is out);
},500);

执行这段代码的时候,浏览器异步执行计时操作,当500ms到了后,会触发定时事件,这个时候,就会把回调函数放到任务队列里。整个程序就是通过这样的一个个事件驱动起来的。
所以说,js是一直是单线程的,浏览器才是实现异步的关键

以下转自互联网:

js一直在做一个工作,就是从任务队列里提取任务,放到主线程里执行。下面我们来进行更深一步的理解。
event loop
图片来自Philip Roberts的演讲《Help, I'm stuck in an event-loop》非常深刻!
我们把刚才了解的概念和图中做一个对应,上文中说到的浏览器为异步任务单独开辟的线程可以统一理解为WebAPIs,上文中说到的任务队列就是callback queue,我们所说的主线程就是有虚线组成的那一部分,堆(heap)和栈(stack)共同组成了js主线程,函数的执行就是通过进栈和出栈实现的,比如图中有一个foo()函数,主线程把它推入栈中,在执行函数体时,发现还需要执行上面的那几个函数,所以又把这几个函数推入栈中,等到函数执行完,就让函数出栈。等到stack清空时,说明一个任务已经执行完了,这时就会从callback queue中寻找下一个人任务推入栈中(这个寻找的过程,叫做event loop,因为它总是循环的查找任务队列里是否还有任务)。

相关文章:

详解js异步文件加载器,详解js异步加载

原生JS怎么异步请求实现Ajax

相关视频:

JS#jQuery宽高的理解和应用

热心网友 时间:2022-05-14 18:25

那个异步其实就是队列。
每行代码都是从上往下执行这你已经知道。
异步就是将代码添加到执行队列末尾。。
console.log(1);setTimeout(function(){ console.log(2);},0);//注意这里我写了间隔0秒console.log(3);

如果按照多线程的话,这样写有可能输出123也有可能输出132
但是js的单线程的,将异步代码放到了末尾执行,所以结果一定是132
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
夫妻养狗狗把谁当主人 两人同养狗认谁当主人 什么蔬菜和水果可以美容祛斑呢? vivox60怎么查看参数配置详情 怎样查看vivo手机的屏幕参数? vivo手机怎么看手机参数 vi##手机怎么看配置? 义乌到湖州没有直达快客???必须到南浔?? 湖州到绍兴的汽车有几班? 注销驾考需要本人吗 芥香牛肉粒做法 为什么电脑版的全民K歌,进去是空白页的,求大神 四川人常说的“耙耳朵”,到底是什么意思? 为什么进全民K歌时就是空白 泸州凉拌生牛肉的做法 耙耳朵是什么意思? 芥末小牛肉的做法,芥末小牛肉怎么做 国家公职人员被单位领导违纪违法解除了公职,如何维权? 把公职人员上班的视频拍到网上,算侵权吗? 作为一名公务员被实名举报作风有问题。对以后的仕途有影响吗? 铁路公职人员被投诉举报怎么办 公职人员上班看电视剧依据什么处分 山东枣庄公职人员上班时间追剧,你对公职人员上班时间看剧有何看法? 公职人员上班时在大厅玩手机追剧,这种行为是否违规? 女子举报公职人员上班追剧,公职人员空闲时可以适当玩手机吗? 女子举报公职人员上班玩*剧,你觉得工作期间玩手机合适吗? 办事民众举报公职人员上班摸鱼,相关部门对此有何回应? 女子举报公职人员上班玩追剧,对于该名公职人员的行为你有什么看法? 山东2公职人员上班玩手机追剧被拍,你对这种现象如何看待? 山东枣庄2名公职人员上班玩手机追剧,官方对此有何回应? nodejs settimeout 是异步的还是同步的 耙耳朵是啥子意思! 关于JavaScript的异步settimeout里let变量的赋值问题 四川烹饪菜品功夫牛肉的做法 js的settimeout能解决异步吗 全民K哥录音后,提示保存成功,但本地录音里却什么都没有,是空的,怎么回事? 重庆人说的&quot;耙耳朵&quot;是什么意思 芥末生牛肉怎么做 华为P9 如何让微信运动没有步数显示 如何关闭微信同步手机身体传感器... 耙耳朵是啥意思? 全民k里内存不足怎么回事? 现在怎么用qq注册 耙耳朵的介绍 大连海事大学里什么专业适合女生 全民K没系统消息 耙耳朵的真正含义是什么? JS中多个setTimeOut函数为什么会同时运行 大连海事大学哪些专业不适合女生?有性别要求? 自制减肥饮料食谱 耙耳朵的拼音