javascript的事件循环机制

每天一个前端面试题之 javascript的事件循环机制

这个概念是学习javascript的必备,当时学习的时候只是简单的了解,现在也是在看了多篇博客和其他参考资料以后自己总结一下,希望能够达到更深入的理解和认识。

前言

  1. javascript是一门单线程非阻塞的脚本语言
  2. 单线程是指javascript在代码执行的时候,同一时间只能做 一件事,只有一个主线程来处理所有的任务
  3. 这个主线程被称为执行栈
  4. 非阻塞是指带代码需要执行一项异步任务时,主线程会挂起这个任务,并将异步任务的回调函数添加到任务队列中,然后在异步任务返回结果的时候再根据一定的规则去执行相应的回调。
  5. 上述的“一定的规则”就是所说的事件循环机制

异步任务有哪些

1.普通事件,click,resize等
2.资源的加载,如ajax请求,load,error等
3.定时器,SetInterval,SetTimeout

执行栈

栈是一种数据结构,具有先进后出的原则

当我们调用一个方法的时候,js会生成一个与这个方法对应的执行环境,又叫执行上下文。而当一系列方法被依次调用的时候,因为js是单线程的,同一时间只能执行一个方法,于是这些方法被排队在一个单独的地方。这个地方被称为执行栈。

当一个脚本第一次执行的时候,js引擎会解析这段代码,并将其中的同步代码按照执行顺序加入执行栈中(入栈),然后从头开始执行。如果当前执行的是一个方法,那么js会向执行栈中添加这个方法的执行环境,然后进入这个执行环境继续执行其中的代码。当这个执行环境中的代码 执行完毕并返回结果后,js会退出这个执行环境并把这个执行环境销毁(出栈),回到上一个方法的执行环境。这个过程反复进行,直到执行栈中的代码全部执行完毕。

任务队列

队列是一种数据结构,具有先进先出的原则

js引擎遇到一个异步事件后并不会一直等待其返回结果,而是会将这个事件挂起,继续执行执行栈中的其他任务。当一个异步事件返回结果后,js会将这个事件的回调函数加入与当前执行栈不同的另一个队列,我们称之为任务队列

被放入任务队列不会立刻执行其回调,而是等待当前执行栈中的所有任务都执行完毕, 主线程处于闲置状态时,主线程会去查找任务队列是否有任务。如果有,那么主线程会从中取出排在第一位的事件,并把这个事件对应的回调放入执行栈中࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值