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

JS函数的执行时机

发布网友 发布时间:2024-09-05 22:40

我来回答

1个回答

热心网友 时间:2024-10-04 08:56

函数执行的时机不同,运行结果也不同。leti=0for(i=0;i<6;i++){setTimeout(()=>{console.log(i)},0)}

上面的代码中,console.log(i)打印的结果是6个6,而不是0,1,2,3,4,5。这里便用到了调用时机,下面有图有真相。

以上代码用到了一个setTimeout,setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行。所以就有了上面代码会打印出6个6的情况。

可以这样理解

因为JS是单线程的,单线程就意味着所有任务需要排队,前一个任务结束后,才会执行后一个任务。

同步任务:上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做下一件事情–>JS中大部分都是同步编程。

异步任务:规划要做一件事情,但是不是当前立马去执行这件事情,需要等一定的时间,这样的话,我们不会等着他执行,而是继续执行下面的操作。

所以在for循环时

先赋值i的值为0

然后判断是否i<6?如果满足条件会继续进入下一个循环。

setTimeout()代码到了这里会等一会执行,这里便会跳过继续执行i++

执行i++,此时i赋值为1.

继续判断i<6,满足进入第二个循环.

.

.

.

直到执行i++,i的值是6时,不满足i<6.

跳出循环

执行第一次循环的setTimeout()//打印出i

执行第二次循环的setTimeout()//打印出i

执行第三次循环的setTimeout()//打印出i

执行第四次循环的setTimeout()//打印出i

执行第五次循环的setTimeout()//打印出i

执行第六次循环的setTimeout()//打印出i

结束,打完收工现在可以看出,由于setTimeout()的执行时间为for语句执行后,所以每次打印出的结果都为6

到了这里便需要介绍以下setTimeout()

setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行

代码到了这里时会把函数放在任务队列中,当JS引擎线程空闲时并达到指定时间时,才会把函数放到JS引擎线程中执行。

就算setTimeout()的时间参数为0时,也必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。

但是往往就有很多愣头青,来骗,来胡搅蛮缠必须让它打印出来0,1,2,3,4,5,没错就是在座的各位,??,没问题安排for(leti=0;i<6;i++){setTimeout(()=>{console.log(i)},0)}

上面代码,便会打印出0,1,2,3,4,5.

:---------:

理解

简单来讲就是把let写在for循环里面,这样可以单纯为每个i创造一个块级作用域,也就是复制6个i。

这里的变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新变量。

虽然每一轮循环时i都会重新声明,但是JS内部引擎会记住上一轮循环的值,然后复制了一个i的值,在初始化上一轮变量i的同时,保证了下一轮循环可以在上一轮循环的基础上进行计算,每次循环的i其实都是一个新的变量。

这样,在6次循环依次得出0/1/2/3/4/5,等待for循环结束后,setTimeout()开始执行,打印出012345。

除了let和for配合之外还有以下别的办法打印出0,1,2,3,4,5

使用立即执行函数

leti=0for(i=0;i<6;i++){!function(i){setTimeout(()=>{console.log(i)},0)}(i)}

还可以使用setTimeout的第三个参数

leti=0for(i=0;i<6;i++){setTimeout((i)=>{console.log(i)},0,i)}

使用const关键字

letifor(i=0;i<6;i++){constx=isetTimeout(()=>{console.log(x)})}以上三种方法都可以打印出0,1,2,3,4,5,网络搜寻
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
erp可以看评论地址吗 淘宝评论url是什么意思? 揭秘:码牌支付风控升级,背后真相揭秘 电脑电视直播软件哪个好用什么软件好电脑看电视直播 潼南子同街学区是哪些 三极管BU406价格和参数? 火锅料放在冰柜忘了插电一个星期给会坏了吗 火锅的设备有哪些 火锅餐厅厨房有哪些 小火锅厨房设备有哪些 页面加载完毕马上执行js代码? js代码如何运行(js执行js代码) 没学历学什么手艺好(没学历学什么手艺好就业) 应付职工薪酬是指什么 应付职工薪酬是什么 18岁女儿生日短句暖心 十八岁女孩生日祝福语简短精辟 十分感恩的句子精选176句 长寿花寓意及花语 长寿花摆放禁忌 阳西属于哪个市 阳西县哪个省哪个市 万圣夜出生的男孩好不好 万圣节出生男孩有什么说法-今日头条 2022年万圣夜出生的孩子一生命运好不好 2022年万圣夜出生的孩子运势好不... 如何突破分数乘除法应用题的难点 万圣节前夜出生的人好不好 万圣节前夜出生的孩子命运-今日头条 如何提高乘除法应用题的解题能力 万圣夜生的孩子好不好 经济富裕也一样一生富贵-今日头条 万圣夜生的宝宝有什么说法 贵人运极佳-今日头条 祝儿子生日快乐的祝福语 送给儿子的生日快乐祝福语 立夏的祝福语大全 2024年立夏时节优美诗句和文案大全 “禅之蕴,精气神”能否呼应 一本好书,是智者,是良师,是什么,是什么,也是什么。 血气方刚和老气横秋对仗工整吗 武陵渔人忘路之远近,发现了桃花林,甚是好奇,就 填一个四字词语 一本你喜爱的书就是什么也是什么 言谈什么四字词语如发现线索 平安扣的编法 平安扣绳子应该怎么编 平安扣系法 平安扣的绳子编法 平安扣吊坠系法图解,平安扣吊坠编法图解 关于2011年7月1日新出台的《社会保险》问题? 上海市2011年7月将为所有外来从业人员缴纳社保 在固戍地铁站怎样坐车到罗湖?过程中要转车吗? 集体合同可以由什么代表职工与企业签订 固戍到罗湖坐几号地铁 农村自建房防雷跳闸的注意事项 农村自建房别墅防雷可以参考这样做,经济实惠耐用 弥勒佛梵文怎么写? 财产保全需要满足什么条件 民事案件财产保全应当具备哪些条件 我想把“我想你”这三个字藏在诗里,求高手帮忙