当前位置: 首页 > news >正文

网站seo月报今日热搜榜排名最新

网站seo月报,今日热搜榜排名最新,朝阳市网站建设,如何做网站弹窗广告大家都知道js是单线程的脚本语言,在同一时间,只能做同一件事,为了协调事件、用户交互、脚本、UI渲染和网络处理等行为,防止主线程阻塞,Event Loop方案应运而生... 为什么js是单线程? js作为主要运行在浏览器…

大家都知道js是单线程的脚本语言,在同一时间,只能做同一件事,为了协调事件、用户交互、脚本、UI渲染和网络处理等行为,防止主线程阻塞,Event Loop方案应运而生...

为什么js是单线程?

js作为主要运行在浏览器的脚本语言,js主要用途之一是操作DOM。

在js高程中举过一个栗子,如果js同时有两个线程,同时对同一个dom进行操作,这时浏览器应该听哪个线程的,如何判断优先级?

为了避免这种问题,js必须是一门单线程语言,并且在未来这个特点也不会改变。


执行栈与任务队列

因为js是单线程语言,当遇到异步任务(如ajax操作等)时,不可能一直等待异步完成,再继续往下执行,在这期间浏览器是空闲状态,显而易见这会导致巨大的资源浪费。

执行栈

当执行某个函数、用户点击一次鼠标,Ajax完成,一个图片加载完成等事件发生时,只要指定过回调函数,这些事件发生时就会进入任务队列中,等待主线程读取,遵循先进先出原则。

执行任务队列中的某个任务,这个被执行的任务就称为执行栈。

主线程

要明确的一点是,主线程跟执行栈是不同概念,主线程规定现在执行执行栈中的哪个事件。

主线程循环:即主线程会不停的从执行栈中读取事件,会执行完所有栈中的同步代码。

当遇到一个异步事件后,并不会一直等待异步事件返回结果,而是会将这个事件挂在与执行栈不同的队列中,我们称之为任务队列(Task Queue)。

当主线程将执行栈中所有的代码执行完之后,主线程将会去查看任务队列是否有任务。如果有,那么主线程会依次执行那些任务队列中的回调函数。

不太理解的话,可以运行一下下面的代码,或者点击一下这个示例

结果是当a、b、c函数都执行完成之后,三个setTimeout才会依次执行。

let a = () => {setTimeout(() => {console.log('任务队列函数1')}, 0)for (let i = 0; i < 5000; i++) {console.log('a的for循环')}console.log('a事件执行完')
}
let b = () => {setTimeout(() => {console.log('任务队列函数2')}, 0)for (let i = 0; i < 5000; i++) {console.log('b的for循环')}console.log('b事件执行完')
}
let c = () => {setTimeout(() => {console.log('任务队列函数3')}, 0)for (let i = 0; i < 5000; i++) {console.log('c的for循环')}console.log('c事件执行完')
}
a();
b();
c();
// 当a、b、c函数都执行完成之后,三个setTimeout才会依次执行

js 异步执行的运行机制。

  1. 所有任务都在主线程上执行,形成一个执行栈。
  2. 主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
  3. 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列"。那些对应的异步任务,结束等待状态,进入执行栈并开始执行。
  4. 主线程不断重复上面的第三步

宏任务与微任务:

异步任务分为 宏任务(macrotask) 与 微任务 (microtask),不同的API注册的任务会依次进入自身对应的队列中,然后等待 Event Loop 将它们依次压入执行栈中执行。

宏任务(macrotask):

script(整体代码)、setTimeout、setInterval、UI 渲染、 I/O、postMessage、 MessageChannel、setImmediate(Node.js 环境)

微任务(microtask):

Promise、 MutaionObserver、process.nextTick(Node.js环境)

Event Loop(事件循环):

Event Loop(事件循环)中,每一次循环称为 tick, 每一次tick的任务如下:

  • 执行栈选择最先进入队列的宏任务(通常是script整体代码),如果有则执行
  • 检查是否存在 Microtask,如果存在则不停的执行,直至清空 microtask 队列
  • 更新render(每一次事件循环,浏览器都可能会去更新渲染)
  • 重复以上步骤

宏任务 > 所有微任务 > 宏任务,如下图所示:

从上图我们可以看出:

  1. 将所有任务看成两个队列:执行队列与事件队列。
  2. 执行队列是同步的,事件队列是异步的,宏任务放入事件列表,微任务放入执行队列之后,事件队列之前。
  3. 当执行完同步代码之后,就会执行位于执行列表之后的微任务,然后再执行事件列表中的宏任务

上面提到的示例结果可以这么理解:先执行script宏任务,执行完了之后,再执行其他两个定时器宏任务。


面试题实践

下面这个题,很多人都应该看过/遇到过,重新来看会不会觉得清晰很多:

    // 执行顺序问题,考察频率挺高的,先自己想答案**setTimeout(function () {console.log(1);});new Promise(function(resolve,reject){console.log(2)resolve(3)}).then(function(val){console.log(val);})console.log(4);

根据本文的解析,我们可以得到:

先执行script同步代码

 先执行new Promise中的console.log(2),then后面的不执行属于微任务然后执行console.log(4)

执行完script宏任务后,执行微任务,console.log(3),没有其他微任务了。

执行另一个宏任务,定时器,console.log(1)。

根据本文的内容,可以很轻松,且有理有据的猜出写出正确答案:2,4,3,1.

http://www.lbrq.cn/news/2516797.html

相关文章:

  • 衡阳市做网站百度知道客服电话人工服务
  • 网站多久跨境电商网站开发
  • 北京网站手机站建设公司电话号码开封网络推广哪家好
  • python 做下载网站百度关键词查询工具
  • 网络规划设计师考试内容上海关键词优化报价
  • 青岛网站建设搭建企业网站推广方案设计毕业设计
  • 做网站要注意什么如何优化网站排名
  • portfolio wordpressseo技术培训机构
  • 网站建设常用结构类型教育机构培训
  • 黄石做网站的公司中小企业网络营销现状
  • 中学生做网站友情手机站
  • 如何做双版网站seo关键词排名实用软件
  • 北京电商网站开发费用怎么做免费的网站推广
  • 微信免费做邀请函模版网站怎样制作一个网页
  • 重庆怎么自己做网站看广告收益的正规平台
  • 学网站开发的软件网络营销运营方案
  • 收到网站代码后怎么做重庆森林讲了什么故事
  • 重庆百度网站推广腾讯会议付费
  • 学校网站建设评比专业网站制作网站公司
  • 做网站如何挂支付系统新乡网站seo
  • 长春谁家做网站电商营销的策略与方法
  • 公司简介网站模板怎么创建个人网站
  • wordpress的pdf阅读seo是什么?
  • 在线做章网站搜外友链平台
  • 政府网站 建设依据nba交易最新消息汇总
  • 用jsp做网站登录界面模板潍坊网站关键词推广
  • 怎么找做网站的客户中国的搜索引擎有哪些
  • 上海比较好的服装外贸公司优化网站seo策略
  • 连州住房建设局网站王通seo教程
  • 厦门网站建设公司哪家好seo技术培训沈阳
  • 智能Agent场景实战指南 Day 26:Agent评估与性能优化
  • 服务器与电脑主机的区别,普通电脑可以当作服务器用吗?
  • MCP error -32000: Connection closed
  • 数据结构之顺序表链表栈
  • 「源力觉醒 创作者计划」_文心大模型4.5系列开源模型,意味着什么?对开发者、对行业生态有何影响?
  • JavaScript手录07-数组