body click js 委托_JS 事件循环

9ea1e832d8b80f5a8febe491ba50e9d7.png

进程 线程

  • CPU 分配资源的最小单位是进程,同一个时间内单个 CPU 只能运行一个进程,单个 CPU 一次只能运行一个任务
  • CPU 调度的最小单位是线程,一个进程里面包含多个线程。
  • 可以看看阮老师的这篇文章,进程与线程的一个简单解释

浏览器的进程

  • 浏览器主进程
    • 负责界面展示,用户交互,子进程管理,文件存取等
  • 插件进程
  • GPU 进程
    • 3d绘制
  • 网络进程
  • 渲染进程
    • 主要负责将 HTML, CSS, JavaScript 转换为用户可交互的网页,排版引擎 Blink 和
    • JavaScript 引擎 V8 就运行在渲染进程,默认每个 tab 一个渲染进程
    • 浏览器内核

浏览器的渲染流程

  • 解析 HTML 文件,生成 DOM tree;同时解析 CSS 文件以及样式元素中的样式数据,生成 CSS Rules
  • 构建 render tree:根据 DOM tree 和 CSS Rules 来构建 render tree,它可以让浏览器按照正确的顺序绘制内容
  • 布局(layout / reflow):计算各元素尺寸、位置。
  • 绘制(paint):绘制页面像素信息。
  • 浏览器将各层信息发送给 GPU,GPU 将各层信息合成(composite),显示在屏幕上。

浏览器内核

  • GUI 渲染线程
  • JS 引擎线程
    • JavaScript 是单线程的
    • GUI 渲染线程 与 JS 引擎线程是互斥的
    • JS 阻塞页面加载
  • 事件触发线程
  • 定时触发器线程
  • 异步 http 请求线程

宏任务,微任务

  • 事件轮询解释:事件轮询-阮一峰
  • JS 单线程
    • 单线程中如果同步执行的代码很慢,会让其它程度等待很长时间,这是同步阻塞。
    • 多线程会占用多倍的资源也会浪费多倍的资源,也不合理。
    • event_loop 是把需要等待的程序放到异步队列,主调用函数执行完之后监听,再执行异步队列,整个过程就是个不断的循环
    • JS 引擎遇到一个异步事件后并不会一直等待其返回结果,而是会将这个事件挂起,继续执行执行栈中的其他任务。当一个异步事件返回结果后,js会将这个事件加入与当前执行栈不同的另一个队列,我们称之为事件队列。被放入事件队列不会立刻执行其回调,而是等待当前执行栈中的所有任务都执行完毕, 主线程处于闲置状态时,主线程会去查找事件队列是否有任务。如果有,那么主线程会从中取出排在第一位的事件,并把这个事件对应的回调放入执行栈中,然后执行其中的同步代码…,如此反复,这样就形成了一个无限的循环。这就是这个过程被称为“事件环(Event Loop)”
  • 宏任务 宿主环境提供的异步方法 都是宏任务 script,ui 渲染,setTimeout,setInterval、setImmediate
  • 微任务 语言标准提供 promise,mutationObserver,process.nextTick,Object.observe(已废弃)
  • 默认先执行 script 脚本中的代码 -> 会清空微任务(将所有的微任务全部执行完) -> 渲染页面 -> 取出一个宏任务执行 -> 执行完毕后会再次情空微任务...

5ba0cc6178c29e64c3e10a28025074c0.png
微任务和宏任务执行
  • 浏览器黄色
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- script是一个宏任务 --><script>document.body.style.background = 'red';console.log(1);// 在 setTimeout 执行前 会触发一次渲染Promise.resolve().then(()=>{console.log(2);document.body.style.background = 'yellow';});console.log(3);</script>
</body>
</html>
  • 按钮事件执行顺序
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><button id="button">点我啊</button><script>button.addEventListener('click', ()=>{console.log('listener1');Promise.resolve().then(()=>console.log('micro task1'));});button.addEventListener('click', ()=>{console.log('listener2');Promise.resolve().then(()=>console.log('micro task2'));});// 点击按钮之后的顺序// listener1// micro task1// listener2// micro task2// 一个个的函数来取 每次执行完 会先处理当前定义的微任务button.click(); // click1() click2()// listener1 listener2 micro task1 micro task2</script>
</body>
</html>
  • promise 和 setTimeout
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>Promise.resolve().then(() => {console.log('Promise1')setTimeout(() => {console.log('setTimeout2');}, 0);});setTimeout(() => {console.log('setTimeout1');Promise.resolve().then(() => {console.log('Promise2');});}, 0);// Promise1 setTimeout1 Promise2 setTimeout2</script>
</body>
</html>
  • 执行顺序
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>console.log(1);async function async () {console.log(2);await console.log(3); // Promise.resolve(console.log(3)).then(console.log(4))console.log(4);}setTimeout(() => {console.log(5);}, 0);const promise = new Promise((resolve, reject) => {console.log(6); // new Promise 代码会立即执行resolve(7);})promise.then(res => { // 第一个微任务console.log(res)});async (); console.log(8);// 1 6 2 3 8 7 4 5</script>
</body>
</html>
  • 执行顺序
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>console.log('script start');setTimeout(function() {console.log('setTimeout');}, 0);Promise.resolve().then(function() {console.log('promise1');}).then(function() {console.log('promise2');});console.log('script end');// script start// script end// promise1// promise2// setTimeout</script>
</body>
</html>
  • 一段变态的代码
// 1 7 6 8console.log('1');setTimeout(function() {console.log('2');process.nextTick(function() {console.log('3');});new Promise(function(resolve) {console.log('4');resolve();}).then(function() {console.log('5')});}, 0);process.nextTick(function() {console.log('6');});new Promise(function(resolve) {console.log('7');resolve();}).then(function() {console.log('8')});setTimeout(function() {console.log('9');process.nextTick(function() {console.log('10');});new Promise(function(resolve) {console.log('11');resolve();}).then(function() {console.log('12')});}, 0);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java格式_JAVA语言格式

3.1 常量 3.1.1 常量概述 – 在程序执行的过程中&#xff0c;其值不可以发生改变的量 3.1.2 常量分类 – 字符串常量用双引号括起来的内容(“HelloWorld”) – 整数常量 所有整数(12,-23) – 小数常量 所有小数(12.34) – 字符常量 用单引号括起来的内容(‘a’,’A’,’0’) –…

django jsonresponse_利用 Django 动态展示 Pyecharts 图表数据的几种方法

本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法!Django 模板渲染1. 新建一个 Django 项目命令行中输入以下命令django-admin startproject pyecharts_django_demo创建一个应用程序python manage.py startapp d…

python网页登录验证码不显示_进网页需要验证码?不好意思,Python从来不惧各种验证码!...

今天要来说说滑动验证码了大家应该都很熟悉点击滑块然后移动到图片缺口进行验证现在越来越多的网站使用这样的验证方式为的是增加验证码识别的难度那么&#xff0c;对于这种验证码应该怎么破呢接下来就是见证神奇的时刻打开 b 站的登录页面可以看到登录的时候需要进行滑块验证按…

怎么调用新建模型里文章的内容_优雅地进行Tensorflow Lite模型转换

初涉知乎江湖&#xff0c;知道大佬很多&#xff0c;请温柔以待&#xff01;&#xff01;&#xff01;七日凌晨&#xff0c;谷歌连夜发布了有关于Tensorflow最新成果和技术&#xff0c;这应该是贾扬清离开脸书后另一个深度学习界令人惊呼的事件了吧&#xff01;&#xff08;旁白…

elastic java_ElasticSearch和Java环境变量

当我下载并解压缩elasticsearch并运行/bin/service.bat或/bin/elasticsearch.bat文件时&#xff0c;我进入了终端&#xff1a;JAVA_HOME environment variable must be set! Press any key to continue . . .当我这样做时&#xff0c;终端关闭。我已经卸载并重新安装&#xff0…

git add后取消_Git常用命令-总结

创建git用户$ git config --global user.name "Your Name"$ git config --global user.email "emailexample.com"初始化一个Git仓库&#xff0c;使用git init命令。添加文件到Git仓库&#xff0c;分两步&#xff1a;使用命令git add &#xff0c;注意&…

java数组图片_在JAVA中定义图片数组

为实现此意图需要分三段来实现&#xff1a;1。 初始化&#xff1a; Image[] imgnew Image[n];for(int i0;iimg[i]Toolkit.getDefaultToolkit().createImage(....)//装入图片位置}2. 启动变换图片与刷新界面线程run(){//线程入口while(flag){index;index%n;(或写成if(index>n…

查看csv编码_[小O地图-数据] - 坐标转地址文字(逆地理编码)

小O地图是一款基于互联网地图进行地理数据处理、分析、图表的软件。致力为广大科研人员提供专业地图数据&#xff0c;用于科研及学习。小&#xff2f;地图提供将【经纬度坐标转换为地址】的功能&#xff0c;例如&#xff1a;将“116.359861, 39.917225” 转换为 “北京市西城区…

c# mysql 封装_C#简单通用的数据库连接封装

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Data;usingSystem.Data.SqlClient;namespaceDbLib{/// ///数据库类/// public classDatabase : IDisposable{/// ///受保护的数据库连接/// protecte…

python自动化办公源码_python自动化办公:文件篇(自动整理文件,一键完成)

import os list_all[]#初始化一个空列表 for root ,dirs,files in os.walk(rC:UsersShineionDesktop新建文件夹): for name in files: file_pathos.path.join(root,name)#包含路径的文件 file_nameos.path.split(file_path)[-1] list_all.append(file_name) print(list_all)如果…

java中no1_Java程序设计实验(NO.1).doc

Java程序设计实验(NO.1)1、实验目的&#xff1a;使用Java的String类操作字符串和子串。写一个程序可以对两个字符串进行测试&#xff0c;判断第一个字符串是否包含在第二个字符串中&#xff0c;例如字符串“op”包含在字符串“interoperabilityop”中。当第一个字符串包含在第二…

ocr中文数据集_CNOCR:测试集准确率最高98%,自带识别模型的中文OCR包

今天 Gitee 为大家介绍的是一款中文 OCR 包。大家都知道&#xff0c;训练模型是一件非常费时费力的事情&#xff0c;但今天这款项目已经自带训练好的识别模型&#xff0c;我们只需要下载下来使用即可&#xff0c;可以说是非常方便了&#xff0c;那么下面我们就去看看这个项目的…

java inner static_Java SE Static Inner

Java SE Static Inner/*内部类使用示例*/package demo;class Outer{int outer_i100;static int outer_j200;final int outer_k300;void test(){Inner in new Inner();in.display();}static class Inner{void display(){System.out.println("display: outer_j "/*ou…

python知识点分支图_python教程,pythonh学习线路图?

相信对于每个人而言&#xff0c;知道编程和学习编程这件事&#xff0c;出发点是不同的。汤哥在北京接触编程的时间是2013年&#xff0c;那个时候还在一个二线城市上大学&#xff0c;还没有这么多各种融资,各种互联网创业的氛围&#xff0c;大家想的更多的是一些线下的&#xff…

sha算法源代码java_SHA算法Java实现

一 简介安全散列算法固定长度摘要信息二 SHA算法SHA-1、SHA-2(SHA-224、SHA-256、SHA384、SHA-512)三 SHA算法实现package com.imooc.security.sha; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Security; impo…

python定义函数求和_Python定义函数实现累计求和操作

一、使用三种方法实现0-n累加求和 定义函数分别使用while循环、for循环、递归函数实现对0-n的累加求和 1、使用while循环 定义一个累加求和函数sum1(n),函数代码如下&#xff1a; 2、使用 for循环 定义一个累加求和函数sum2(n),函数代码如下&#xff1a; 3、使用递归函数 定义一…

python策略模式_Python-设计模式之策略模式

一次策略模式的代码实践需求清单1.单个商品购买数量大于20个&#xff0c;订单折扣10%2.商品种类超过或等于5个&#xff0c;订单折扣20%3.订单总价超过10000元&#xff0c;订单折扣15%4.客户积分达到2000&#xff0c;折扣7%目前折扣计算方式有4种&#xff0c;为了提高代码的扩展…

arraylist remove() java_执行ArrayList的remove(object)方法抛异常?

简介或许有很多小伙伴都尝试过如下的代码&#xff1a;然后会发现抛出java.util.ConcurrentModificationException异常&#xff0c;这是一个并发异常。那么这个到底是什么情况&#xff1f;首先需要介绍一下增强for循环增强for循环增强for循环是Java1.5后&#xff0c;Collection实…

centos gdb调试_gdb-miss-debuginfo

使用gdb调试core时候&#xff0c;提示Missing separate debuginfos的解决办法。错误提示错误提示信息如下&#xff1a;Missing separate debuginfos, use: debuginfo-install glibc-2.17-106.el7_2.8.x86_64 libaio-0.3.109-13.el7.x86_64 libgcc-4.8.5-4.el7.x86_64 libstdc-4…

用java编写保留两位小数_Java保留两位小数的几种写法总结

摘要&#xff1a;这篇Java开发技术栏目下的“Java保留两位小数的几种写法总结”&#xff0c;介绍的技术点是“Java保留两位小数、保留两位小数、两位小数、Java、小数、总结”&#xff0c;希望对大家开发技术学习和问题解决有帮助。本文列举了几个方法&#xff1a;1. 使用java.…