作用域、垃圾回收机制、闭包、构造函数

news2024/9/22 11:34:18

作用域

作用域规定了变量能够被访问的 ‘范围’,离开了这个范围变量便不能被访问

分为:

  • 局部作用域
    • 函数作用域
    • 块级作用域 let/const
  • 全局作用域

作用域链

嵌套关系的作用域串联起来形成了作用域链

作用:作用域链本质上是底层的变量的查找机制

  • 函数被执行时,会优先查找当前函数作用域中的变量
  • 如果当前作用域中查找不到会逐级向上查找父级作用域直到全局作用域
  • 子作用域能够访问父作用域,父作用域无法访问子作用域
    // 全局作用域
        let a = 11
        let b = 22
        // 局部作用域
        function fn() {
            let a = 1
            function g() {
                a = 2
                console.log(a)  // 2
                console.log(b)  // 22
                console.log(c)  // c is not defined
            }
            g()
        }
        fn()

垃圾回收机制[面试题]

垃圾回收机制简称 GC(Garbage Collection)

JS中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收机制自动回收

// 给变量分配内存
const age = 18;
// 给对象分配内存
const obj = {
	age:12
}
// 给函数分配内存
function fn(){
	const age = 13;
	console.log(age);
}

内存的生命周期

js环境中分配的内存,有如下生命周期:

  • 内存分配 :声明变量,函数,对象的时候,系统会自动为他们分配内存
  • 内存使用: 既读写内存,使用变量 ,函数等
  • 内存回收: 使用完毕,由内存回收器 自动回收不再使用的内存

说明:

  • 全局变量一般不会回收(关闭页面回收)
  • 一般情况下局部变量的值,不用了,会被自动回收

内存泄漏:程序中分配的内存由于某种原因程序未释放无法释放 叫做内存泄漏

算法说明:

堆栈空间分配区别

1.栈:由操作系统自动分配释放函数的参数值,局部变量等,基本数据类型放到栈立

2.堆:一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收,复杂数据类型放到堆里

  • 引用计数法

    ’内存不再使用‘ 就是看一个对象是否指向它的引用,没有引用了就回收该对象

    • 跟踪记录被引用的次数
    • 如果被引用了一次,那么就记录次数为1,多次引用会累加 ++
    • 如果减少一个引用就减1
    • 如果引用次数为0 则释放内存
    let arr =[1,2,3,4]
            arr = null
    
    
            let person = {
                age:18,
                name:"佩奇"
            }
            let p = person
            person = 1
            p = null
    

    但它存在一个致命的问题, 嵌套引用

    如果两个对象相互引用,尽管他们已不再使用,垃圾回收器不会进行回收,导致内存泄漏

    //  o1.a = o2   o2.a=o1 他们的引用次数永远不会是0  相互引用---导致内存泄漏
            function fn(){
                let o1={}
                let o2= {}
                o1.a = o2
                o2.a = o1
                return "引用计数无法回收"
            }
    

在这里插入图片描述

  • 标记清除法

    现代的浏览器已经不再使用引用计数法了,使用标记清除法

    核心:

    • 标记清除法 将 ’不再使用的对象‘ 定义为 无法达到的对象
    • 就是从根部(js中就是全局对象) 出发 定时扫描内存中的对象,凡是能从根部到达的对象,都是还需要使用
    • 那些无法由根部触发触及到的对象被标记为不再使用,进行回收
     function fn(){
                let o1={}
                let o2= {}
                o1.a = o2
                o2.a = o1
                return "引用计数无法回收"
            }
    

    在这里插入图片描述

闭包

闭包可以让开发者从内部函数访问外部函数的作用域

简单理解: 闭包 = 内层函数+外层函数的变量

作用: 实现数据的私有,避免全局污染,外部也可以访问里层函数的变量

// 闭包写法--实现了数据私用  
function outer(){
	let count = 1
	function fn1(){
	count++
	console.log(`函数被调用${count}`)
	}
	return fn1
}

result =outer()
result()

闭包很有用,它允许将函数与其所操作的某些数据关联起来

闭包可能引起 内存泄漏

创建对象三种方式

1.对象字面量创建对象

const o = {
  name:"佩奇"
}

2.new Object创建对象

const o = new Object({name:"佩奇"})

3.利用构造函数创建对象

构造函数:是一种特殊的函数,主要用来创建对象(初始化对象)

使用场景:

{…}语法允许创建一个对象,继续创建相同类的对象还需要重新写一次,此时可以通过构造函数创建多个类似的对象

构造函数在技术上是常规函数,有两个约定

  • 命名以大写字母开头
  • 通过new 关键字来调用构造函数,可以创建对象
    // 构造函数  是一种特殊的函数,用来创建对象
    // - 命名以**大写字母**开头
    // - 通过**new** 关键字来调用构造函数,可以创建对象
    function Person() {

    }
    console.log(new Person())

    function Pig(name, age, gender) {
      // this.name  属性
      // name 是形参 也是属性值
      // this指向创建的对象
      this.name = name
      this.age = age
      this.gender = gender
      //   不写return 默认返回创建的对象
    }
    let p1 = new Pig('佩奇', 6, '女')
    console.log(p1)
    let p2 = new Pig('乔治', 3, '男')
    console.log(p2)

    //   构造函数创建对象说明
    // 1.new关键字 实例化对象--创建对象
    // 2.如果构造函数没有参数,则可以省略小括号
    // 3.构造函数里无需写return
    // new Object()  new Date()  都是在实例化对象

构造函数实例化执行过程

function Pig(name, age, gender) {
	this.name = name
	this.age = age
	this.gender = gender
}

const peiqi = new Pig('佩奇', 6, '女')
console.log(peiqi);

/*
new实例化执行过程:
1.通过new创建新空对象
2.构造函数this指向新对象 动态添加属性
3.执行构造函数代码
4.返回新对象
*/

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

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

相关文章

简写MKL库windows安装以及python如何调用dll库

MKL安装: 最新MKL库下载地址 Donwload: Accelerate Fast Math with Intel oneAPI Math Kernel Library 64位以及32位我直接都安装了 之后配置各种包含目录以及环境变量:网上有很多配置vs的配置教程,这里就不贴了。 (ps: 2023 在vs2019上&a…

nodejs高级编程-核心模块

一、path 1 获取路径中的基础名称 const path require(path)// console.log(__filename) // /Users/liuchongyang/Desktop/分享/网页读取本地文件/node.js// 1 获取路径中的基础名称 /*** 01 返回的就是接收路径当中的最后一部分 * 02 第二个参数表示扩展名,如果…

手把手教-单片机stm32基于w25q128使用文件系统

一、开发测试环境 ①野火stm32f407开发板 ②rtthread操作系统 W25Q128的电路原理图: 二、开发步骤 ①使能spi驱动。 ②使能spi bus/device 驱动,选择sfud驱动。 ③开启dfs功能,选择elm文件系统。 ④保存,重新生成工程。 ⑤下载到…

VueCli 脚手架使用

VueCli 脚手架 到目前为止,已经会了Vue基本使用(去创建vue实例,创建之后再去挂载,挂载之后就去使用各种功能,挂载之后就可以使用其各种功能,data methods compute 以及各个生命周期,常用的属性以…

779. 最长公共字符串后缀

题面: 给出若干个字符串,输出这些字符串的最长公共后缀。 输入格式 由若干组输入组成。 每组输入的第一行是一个整数 NN。 NN 为 00 时表示输入结束,否则后面会继续有 NN 行输入,每行是一个字符串(字符串内不含空白符&…

Redis深入 —— 持久化和事务

前言 最近的学习中,荔枝深入了解了Redis的持久化、Redis事务相关的知识点并整理相应的学习笔记,在这篇文章中荔枝也主要梳理了相应的笔记和基本知识,小伙伴们如果需要的话可以看看哈。 文章目录 前言 一、Redis持久化 1.1 RDB 1.1.1 Redi…

掌握驱动之道:L298N模块多方式驱动电机的优劣分析

L298N模块是一种常用的直流电机驱动模块,它可以通过控制输入端口来实现对电机的速度和方向的控制。L298N模块有3个输入端口:IN1、IN2和EN。 方法一:使用高级定时器输出通道和互补输出通道控制电机 将模块的IN1和IN2分别连接到STM32高级定时器…

Python GUI编程利器:Tkinker中的事件处理(11)

​ 小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日目标 学习下事件处理的相关知识点: 事件处理四要素 事件序列 事件绑定 今天要实现如下效果&#xff1…

Java在Excel中进行数据分析

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前一段时间淘宝出了一个“淘宝人生”的模块,可以看从注册淘宝账号至今的消…

k8s实战3-使用Helm在AKS上发布应用

AKS(Azure Kubenetes Service)是微软云azure上的K8s服务。 主要分为三步 1 连接到AKS 2 用kubectl发布应用 3 用Helm发布应用 1 登录 az login 2 连接dp-npr-dsm-aks(Dsm项目的AKS) az account set --subscription {{subID}} az aks get-credent…

指针的进阶(一)

目录 1. 字符指针 方法一 方法二 字符指针面试题 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组传参和指针传参 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5. 函数指针 代码一 代…

Windows用户怎么取消访问共享文件夹的密码

许多Windows系统用户在访问共享文件夹的时候却提示需要输入密码才可访问。这一步给很多人造成了困扰,其实我们可以取消访问共享文件夹密码。请看下面的两个方法。 方法一: 搜索 网络和共享中心。点击 更改高级共享设置。在最底下密码保护的共享那项&…

用C#写汉诺塔问题

假设要将n个圆盘从A->C,中间可以借助B,那么递归思路是这样的,我们先将除最大的一个圆盘外的其它n-1个圆盘从A->B,借助C,然后将最大的一个圆盘搬到C,最后将刚才的n-1个盘子,从B->C借助A&#xff0c…

Qt完成闹钟提示

未启动: 启动: .cpp #include "widget.h" #include "ui_widget.h"void Widget::btn1_slots() {//点击启动开始定时event_timer this->startTimer(1000);btn1->setEnabled(false);btn2->setEnabled(true);edit2->setEnabled(false…

一个月学通Python(十三):高级Python必须掌握的进阶知识点

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3章,1个月就能全方位的完成Python的学习并进行实战开发。加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础》 文章目录 专栏介绍Python语言进阶1. 数据结构和算法2. 函数的使用方式3. 面向对象相关知识…

Todo-List案例版本五

安装库npm i pubsub-js 消息的订阅与发布 src/App.vue <template><div class"app"><h1>{{ msg }}</h1><School/><Student/></div> </template><script> import Student from ./components/Student import …

微信小程序常用组件的简单使用 view,scroll-view,swiper,swiper-item,text,rich-text,button,image

微信小程序常用组件的简单使用 1. view组件2. scroll-view 组件3. swiper 和 swiper-item 组件3.1. swiper组件中的常用属性 4. text 和 rich-text组件4.1. text组件4.2. rich-text 组件 5. button 组件6. image组件6.1. image的mode属性 1. view组件 view组件就类似于html中的…

问题总结(持续更新,欢迎补充)

文章目录 前言webshell流量特征内存马蜜罐应急响应Windows 事件ID如何是误报还是攻击&#xff08;如何判断是否攻击成功&#xff09;研判的思路渗透测试思路内网渗透相关溯源反制反序列化&#xff08;Shiro、Weblogic、Log4j&#xff09;CDNMySQL5.5版本以上和以下读写权限的区…

linux 系统errno 对应参考及代码

结论 linux下系统errno都有对应的说明描述&#xff0c;发生错误时获取errno即可知道具体问题描述 如下图 代码如下 golang版 package main import ("syscall""strings""fmt" ) func main() {for i : 0; i < 200; i {if !strings.HasPrefi…

【开源项目】自动化运维平台spug

Spug 基本介绍 Spug是面向中小型企业设计的轻量级无Agent的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。 批量执行: 主机命令在线批量执行在线终端: 主机支持浏览器在线终端登录…