学习JavaScript第六天

文章目录

  • 1. JavaScript 中的垃圾回收机制(GC)
    • 1.1 垃圾回收相关概念
      • ① 什么是垃圾
      • ② 什么是垃圾回收
      • ③ 垃圾没有及时回收的后果
      • ④ JavaScript 垃圾回收的常见算法
    • 1.2 引用计数
      • ① 原理
      • ② 优缺点:
    • 1.3 标记清除
      • ① 原理
      • ② 优缺点
  • 2 执行上下文和执行栈
    • 2.1 执行上下文
      • ① 全局执行上下文
      • ② 函数内的执行上下文
    • 2.2 执行栈
    • 2.3 作用域和执行上下文的关系
  • 3. 闭包
    • 3.1 什么是闭包?
    • 3.2 如何产生闭包
    • 3.3 闭包和作用域
    • 3.4 闭包和垃圾回收
    • 3.5 闭包的缺点
    • 3.6 闭包的应用
  • 4. 对象高级
    • 4.1 原型链总结
      • ① 原型和构造函数
      • ② `__proto__` 和 prototype 属性
      • ③ construct 属性
      • ④ 原型链
    • 4.2 面向对象继承
      • ① 面向对象编程语言的继承规则
      • ② JS 中继承关系的特点(原型继承特点)
      • ③ 实现JS中构造函数和构造函数之间继承(子类 父类)
  • 5 单线程和事件轮询机制
    • 5.1 进程和线程
    • 5.2 JS 单线程运行
    • 5.3 同步任务和异步任务
    • 5.4 事件轮询机制
  • 6 JS 实现多线程(了解)

1. JavaScript 中的垃圾回收机制(GC)

1.1 垃圾回收相关概念

① 什么是垃圾

1. 用不到的数据,就是垃圾
2. JavaScript 中没有被引用的对象,就是垃圾对象

② 什么是垃圾回收

1. 销毁垃圾对象,释放内存,就是垃圾回收
2. 需要手动垃圾回收的编程语言: C、C++
3. 自动垃圾回收的编程语言: Java、Python、JS 等

③ 垃圾没有及时回收的后果

垃圾没有及时回收造成内存泄漏,越来越多的内存泄漏会导致内存溢出

内存溢出: 需要使用内存的时候,内存空间不够。

内存泄漏: 垃圾没有回收称为内存泄漏。

④ JavaScript 垃圾回收的常见算法

- 引用计数
- 标记清除

1.2 引用计数

① 原理

- ① 对象有个引用标记
- ② 如果对对象进行了引用 +1
- ③ 取消了对象对象的引用 -1
- ④ 当引用标记=0的时候,变为垃圾对象,并删除

② 优缺点:

- 优点: 及时清除垃圾对象
- 缺点: 互相引用的对象导致无法被回收(内存泄漏)

1.3 标记清除

① 原理

浏览器不停地进行标记清除,每一轮分为标记和清除两个阶段
- 标记阶段:从根对象出发,每一个可以从根对象访问到的对象都会被添加一个标记,于是这个对象就被标识为可到达对象。
- 清除阶段:垃圾回收器,会对内存从头到尾进行线性遍历,如果发现有对象没有被标记为可到达对象,那么就将此对象占用的内存回收。
该轮结束,将原来标记为清除,以便进行下一轮标记清除。

② 优缺点

- 优点:  不会内存泄漏
- 缺点:  需要深度递归,耗费资源较多

2 执行上下文和执行栈

2.1 执行上下文

① 全局执行上下文

1. 打开页面,js代码执行之前,创建 window 对象,确定 window 就是全局执行上下文对象
2. 对全局执行上下文对象进行预处理① 找到使用 var 的变量声明语句,给全局执行上下文对象添加属性,但不赋值② 找到使用 function 的函数声明语句,给全局执行上下文对象添加属性,值是函数③ 给 this 进行赋值,将全局执行上下文对象赋值给 this
3. 正式执行全局代码
4. 页面关闭,全局执行上下文对象销毁

② 函数内的执行上下文

1. 调用函数的时候,函数内代码执行之前,创建该函数的执行上下文对象;
2. 对函数内执行上下文对象进行预处理① 将形参作为函数内执行上下文对象的属性,并赋值② 给函数内执行上下文对象添加属性arguments,并赋值③ 找到函数内使用 var 的变量声明语句,给函数内执行上下文对象添加属性,不赋值④ 找到函数内使用 function 的函数声明语句,给函数内执行上下文对象添加属性,值是函数④ 给 this 进行赋值,将调用该函数的对象赋值给 this
3. 正式执行函数内的语句
4. 函数调用结束,函数内执行上下文对象被销毁

注意: 函数每调用一次,就创建一个执行上下文对象。

2.2 执行栈

栈结构: 是一种数据存储结构,特点先进后出,后进先出。

**执行
栈:**执行上下文对象创建之后,要放入执行栈,放入执行栈才能执行。

2.3 作用域和执行上下文的关系

区别:

1. 变量的作用域在函数声明的时候就确定了,是静态的
2. 执行上下文对象函数调用的时候才创建,每调用一次就创建一次,调用结束会销毁,是动态的

联系:

执行上下文对象从属于所在的作用域:
全局执行上下文对象作用域是全局; 函数内执行上下文对象作用域是所在函数。

3. 闭包

3.1 什么是闭包?

1)简单讲,闭包就是指有权访问另一个函数作用域中的变量的函数。
2)MDN 上面这么说:闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。

3.2 如何产生闭包

1. 函数A中嵌套函数B
2. 函数B中访问函数A中定义的数据(上层作用域的变量)
3. 实现从函数A的外部使用函数B方式一: 将函数B作为返回值方式二: 将函数B赋值给全局对象的属性方式三: 将函数B作为一个事件的回调函数
function A() {// 定义数据var num01 = 100, num02 = 200;// 函数Bfunction B(){// 函数B中可以访问到函数A中的数据console.log(num01 + num02);}// 方式一 函数B作为返回值return B;// 方式二 函数B赋值给全局对象的属性// window.func = B;// 方式三 函数B作为事件的回调函数// document.onclick = B;
}

3.3 闭包和作用域

1. 可以访问上层作用域的数据
2. 作用域只与函数声明的位置有关,与调用位置无关

3.4 闭包和垃圾回收

闭包延长了数据的生命周期

3.5 闭包的缺点

闭包会让数据常驻内存,增加了内存溢出的风险

3.6 闭包的应用

 for (var i = 0; i < tabNavItems.length; i ++) {(function(index){tabNavItems[index].onclick = function() {// 排他// 把所有的tabNav都取消选中  把所有的tabContent隐藏for (var j = 0; j < tabNavItems.length; j ++) {tabNavItems[j].classList.remove('active');tabContentItems[j].classList.remove('active');}// 当前点击的选项卡导航添加 active 类名 表示当前选中this.classList.add('active');// 与当前tabNav对应的tabContent要显示出来tabContentItems[index].classList.add('active');};})(i);}

4. 对象高级

4.1 原型链总结

① 原型和构造函数

1. 构造函数.prototype 可以获取到该构造函数实例的原型
2. 构造函数相同的对象,原型也相同

__proto__ 和 prototype 属性

1. 函数类型的对象__proto__ : 获取的是自己的原型  prototype: 获取的该构造函数的实例的原型2. 其他类型的对象__proto__: 获取的是自己的原型没有 prototype 属性

③ construct 属性

本身具有constructor属性的对象,会作为其他对象的原型,constructor的值就是其他对象的构造函数

④ 原型链

// 自定义的构造函数
function Foo() {}// Foo 的两个实例
var f1 = new Foo();
var f2 = new Foo();// Object的两个实例
var o1 = {};
var o2 = {};
f1、f2 -> Foo.prototype -> Object.prototype
o1、o2 -> Object.prototype
Foo、Object、Function -> Function.prototype -> Object.prototype

特殊现象(不是规则,不要记,要理解)

1. Object 的原型是 Function.prototype, Function.prototype 的构造函数是 Object
2. Function 的构造函数是 Function, 所以 Function.prototype === Function.__proto__

4.2 面向对象继承

① 面向对象编程语言的继承规则

// 父类(对应的就是js中的构造函数)
class Foo{private name;private age;public getInfo() {}
}// 子类
class Product extends Foo {private address;
}// 子类
class Shopcart extends Foo {}

② JS 中继承关系的特点(原型继承特点)

1. 对象可以继承它的原型上的属性
2. 对象的构造函数、它的原型的构造函数也可以描述成子类、父类的关系
1. 对象a的原型是对象b, 对象a的构造函数是子类,对象b的构造函数是父类子类的实例以父类的实例为原型
2. 一个对象只能有一个原型,原型可以作为多个对象的原型一个父类可以有多个子类, 一个子类只能有一个父类

③ 实现JS中构造函数和构造函数之间继承(子类 父类)

原理:

1. 设置子类的实例的原型是父类的一个实例
2. 设置子类的实例的原型的 constructor 属性的值是子类
function A(){}
function B(){}// B作为子类 A作为父类 
// 设置B的实例的原型是 A的一个实例
B.prototype = new A();
// 设置 B.prptotype 的 constructor 属性
B.prototype.constructor = B;
Array是子类 Object是父类
1. Array的实例的原型 是Object的一个实例
2. Array.prototype.constructor 是 Array

实现:

 // 定义商品类 
function Product(price, nums) {// 给实例设置属性this.price = price;;this.nums = nums;
}
Product.prototype.discount = function(num) {this.price *= num;
};
Product.prototype.buy = function() {this.nums -= 1;
}// 汽车类商品
function CarProduct(price, nums, speed) {// this.price = price;// this.nums = nums;// 将父类规定的属性添加到了 CarProduct 的实例上Product.call(this, price, nums);this.speed = speed;
}   
// 设置  CarProduct 的实例的原型是 Product 的一个实例
CarProduct.prototype = new Product();
// 设置 CarProduct 的实例的的原型的 constructor 属性的值是  CarProduct
CarProduct.prototype.constructor = CarProduct;
// 设置方法
CarProduct.prototype.driver = function() {console.log('这辆车可以被驾驶!');
}

5 单线程和事件轮询机制

5.1 进程和线程

进程:程序的一次执行, 它占有一片独有的内存空间线程:CPU的基本调度单位, 是程序执行的一个完整流程进程和线程:* 一个进程中一般至少有一个运行的线程: 主线程。* 一个进程中也可以同时运行多个线程, 我们会说程序是多线程运行的。* 一个进程内的数据可以供其中的多个线程直接共享。* 多个进程之间的数据是不能直接共享的。

5.2 JS 单线程运行

1. 如何证明JavaScript是单线程执行?设置了定时器,定时器的回调函数会等到主线程空闲且时间到执行;如果主线程没有空闲下来,即使定时器的时间到了,回调函数也不会执行(等到主线程空闲)。2. 为什么JavaScript选择单线程?多线程会有线程调度以及线程开启关闭的开销JavaScript主要在浏览器端操作DOM完成特效,如果不是单线程,不好解决页面渲染的同步问题。

5.3 同步任务和异步任务

同步任务:
按照顺序,一步一步地执行,执行完上一个任务再执行下一个任务异步任务:
需要满足条件且主线程空闲才可以执行,在等待异步任务满足条件的过程中,同步任务继续执行,  异步任务会在同步任务完成后执行
异步任务都是回调函数的形式, 回调函数不一定都是异步任务JS中的异步任务有哪些:
1. 定时器的回调函数
2. DOM事件的回调函数
3. Ajax的回调函数
4. Promise的回调涵数
....

5.4 事件轮询机制

1、执行栈(调用栈)主线程里就是一个执行栈,所有的任务都要放入执行栈执行2、异步任务管理模块判断异步任务是否满足了执行条件,分为:定时器管理模块DOM事件管理模块Ajax管理模块...如果满足了异步任务管理模块,会将异步任务放入回调队列,等待执行3. 回调队列队列是一种数据存储结构,特点是先进先出,后进后出回调队列存放等待执行的异步任务4. 事件轮询模块时刻监听主线程(执行栈)是否空闲,一旦空闲,从回调队列中取出异步任务,放入主线程执行

6 JS 实现多线程(了解)

Worker 构造函数
Worker.prototype.postMessage()  向分线程发送数据
Worker.prototype.onmessage      监听分线程的消息

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

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

相关文章

python和C++联合编程

将Python和C结合起来编程可以充分利用Python的易用性和C的高性能。 为什么要结合Python和C编程&#xff1f; Python具有简洁的语法和强大的库支持&#xff0c;非常适合快速开发和数据处理。然而&#xff0c;Python在某些计算密集型任务上的性能不如C。通过将这两种语言结合&a…

MongoDB的复合通配符索引详解

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …

如何使用rdma-core来实现RDMA操作

rdma-core 是一个开源项目&#xff0c;为远程直接内存访问&#xff08;RDMA&#xff09;提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具&#xff0c;旨在简化 RDMA 应用的开发和部署。 基础知识参考博文&#xff1a; 一文带你了解什么是RDMA RDMA 高性能架构基本…

Langchain--如何使用大模型 2.0

【&#x1f34a;易编橙终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 Langch…

【已解决】嵌入式linux mobaxterm unable to open connection to comx 串口正常连接,但终端无法输入

1.点击Session重新选择串口&#xff0c;注意看看串口是不是连接到虚拟机&#xff0c;导致串口被占用。 2.选择PC机与开发板连接的串口&#xff0c;不知道的话可以打开设备管理器看看&#xff0c;选择正确的波特率&#xff0c;一般是115200。 3.关键一步&#xff1a;选择后别急…

UNIX 域协议

1. UNIX域协议 利用socket编程接口实现本地进程间通信 UNIX域协议套接字&#xff1a;可以使用TCP&#xff0c;也可以使用UDP SOCK_STREAM -----> TCP 面向字节流 SOCK_DGRAM -----> UDP 面向数据报 UNIX域协议并不是一个实际的协议族&#xff0c;而是在单个主机上执…

【计算机网络原理】网络层IP协议的总结和数据链路层以太网协议的总结.

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

MobaXterm tmux 配置妥当

一、事出有因 缘由&#xff1a;接上篇文章&#xff0c;用Docker搭建pwn环境后&#xff0c;用之前学过的多窗口tmux进行调试程序&#xff0c;但是鼠标滚动的效果不按预期上下翻屏。全网搜索很难找到有效解决办法&#xff0c;最后还是找到了一篇英文文章&#xff0c;解决了&…

rag实际工程中好用的技巧

rag fusion 这是一个论文来着我记得。而且在langchain官方教学里也有。思路是一个query生成多个同样语义但是表述不同的query&#xff0c;然后分别进去rag&#xff0c;得到多个回答&#xff0c;最后把多个回答fusion&#xff0c;即总结。 这个法子能很好滴增加正确文档的召回…

正点原子imx6ull-mini-Linux设备树下的LED驱动实验(4)

1&#xff1a;修改设备树文件 在根节点“/”下创建一个名为“alphaled”的子节点&#xff0c;打开 imx6ull-alientek-emmc.dts 文件&#xff0c; 在根节点“/”最后面输入如下所示内容 alphaled {#address-cells <1>;#size-cells <1>;compatible "atkalp…

Python 实现绘图软件:基于 tkinter 和面向对象编程

在 Python 中&#xff0c;我们可以使用 tkinter 模块来创建图形用户界面&#xff08;GUI&#xff09;应用程序。本文将介绍如何使用 tkinter 和面向对象编程的思想来实现一个简单的绘图软件。 一、代码分析 1. 导入模块 import tkinter from tkinter import colorchooser我们…

25.惰性队列

介绍 消费者由于各种原因而致使长时间不能消费消息造成堆积。比如有一百万条消息发送到mq中&#xff0c;消费者这时宕机了不能消费消息&#xff0c;造成了消息堆积。惰性队列就有必要了。 正常情况下&#xff0c;消息保存在内存中。消费者从内存中读取消息消费&#xff0c;速…

游戏制作中没想明白的事情

当一个备忘录&#xff0c;有的是还没有时间去深入研究&#xff0c;或者没有从头了解 什么是建模绑定&#xff1f;为什么人物建模&#xff0c;初始化都是双手打开的&#xff1f;平着放武器&#xff0c;但运行的时候武器会自动竖起来&#xff0c;这是怎么做到的&#xff1f; 思…

C++要点总结_04_循环语句

目录 4 循环语句4.1 while循环4.2 do...while4.3 for循环4.4 循环控制4.5 循环嵌套 4 循环语句 循环控制&#xff1a;控制程序重复执行&#xff0c;当不符合循环条件时停止循环。循环控制种类&#xff1a;while循环、do…while循环和for循环语句。 4.1 while循环 while循环:…

mysql数据库基础语法(未完)

数据库的超级用户是root 一、注释 &#xff08;1&#xff09;“-- ”减号减号空格 注意不要省略空格 &#xff08;2&#xff09;“#” 井号 二、数据库操作 1、创建 CREATE DATABASE [IF NOT EXISTS] <数据库名> [CHARACTER SET utf8] 2、删除 DROP DATABASE …

深入理解CSRF与SSRF攻击原理及防御措施

一、CSRF攻击原理及实例 CSRF简介 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;即跨站请求伪造&#xff0c;是一种常见的网络攻击手段。攻击者利用已登录用户的cookie&#xff0c;在用户不知情的情况下&#xff0c;伪造请求执行特定操作。 CSRF攻击实…

KamaCoder 100. 岛屿的最大面积 + Leetcode 695. Max Area of Island

题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可以假设矩阵外均…

XYCTF2024 WP

Pwn&#xff1a; hello_world(签到)&#xff1a; 这里的printf没有格式化字符串漏洞&#xff0c;但是我们依旧可以填充栈来利用printf泄露栈上信息 根据我们能填充的字节数来看&#xff0c;我们无法泄露出libc_start_main128的地址&#xff0c;但是可以泄露libc_start_call_m…

一款免费且功能强大的硬件检测工具,绿色小巧免安装!

HWiNFO是一款免费功能强大且广泛使用的硬件信息检测和监控工具&#xff0c;适用于Windows系统。它能够提供详细的硬件信息&#xff0c;包括CPU、主板、内存、硬盘、显卡等组件的详细规格和性能数据。此外&#xff0c;HWiNFO还支持实时监控硬件状态&#xff0c;如温度、电压和风…

计算机的错误计算(四十六)

摘要 再谈浮点运算的不确定性。 计算机的错误计算&#xff08;十&#xff09;、&#xff08;十一&#xff09;以及&#xff08;三&#xff09;探讨了浮点数的表示误差与浮点运算的一些性质。 下面再谈浮点运算的不确定性。 1. 确保两台不同机器上得到完全相同的浮点运算结果是…