前端面经每日一题Day14

闭包

定义:闭包是指在JavaScript中一个函数能够访问并操作其外部作用域的变量的能力。

原理:一个内部函数能够访问和操作外部函数作用域中的变量,即使外部函数已经执行完毕(外部作用域理应被销毁),但因为内部函数仍然存在,并保持着对外部函数作用域的引用,所以这些变量得以保留,这就形成了闭包。

闭包解决了什么?

1.可以读取函数内部的变量。

2.让这些变量的值始终存储在内存中

闭包就是将函数内部和函数外部连接起来的一座桥梁,闭包随处可将,例如一个Ajax请求成功的回调,一个事件绑定的回调方法,一个settimeout的延时回调。无论使用何种方式对函数类型值进行传递,当函数在别处被调用时,都有闭包的身影。

使用闭包应该注意什么?

  1. 闭包会增加内存开销,因为闭包会保留其外部函数的作用域链,导致这些变量不能被垃圾回收机制回收。解决办法,在退出函数之前,将不使用的局部变量删除。
  2. 内存泄漏,不再用到的内存,没有及时释放。
  3. 代码难以维护,闭包内部是可以访问上级作用域,而如果闭包又是异步执行的话,一定要清楚上级作用域都发生了什么,而这样就需要对代码的运行逻辑和JS运行机制相当了解才能弄明白究竟发生了什么。
  4. 闭包可能会导致一些难以察觉的错误,因为它允许内部函数访问并修改外部函数的变量。

闭包的this指向?

this指向的一般规则

  • 函数在普通调用时,this指向全局对象,严格模式下指向undefined
  • 函数作为对象方法调用时,this指向调用该函数的对象
  • 函数作为构造函数时,this指向新创建的对象实例
  • 使用call,bind,apply方法时,可以显式的绑定到指定的对象。

闭包本身不会改变this的指向规则。闭包中this指向取决于闭包是如何被调用的,而不是闭包被如何定义的。

指向window全局对象。

内存泄漏

定义:无法正确释放不再使用的内存,导致内存占用持续增长,最终有可能导致性能下降或者程序崩溃。

原因:1.未清除的定时器或回调(事件监听器addEventListener)2.闭包中的循环引用。3.全局对象。4.DOM引用未清理。(从DOM中删除元素,如果js有对这个元素的引用,元素将不会被垃圾回收器回收)

解决措施:1.定期清理。2.避免不必要的全局变量。3.管理DOM引用。(从DOM中删除元素,同时删除JavaScript中的引用)

垃圾回收机制

定义:自动化内存管理技术,负责在程序运行过程中检测并回收不再使用的内存,释放资源并避免内存泄漏

原理:自动扫描内存中的对象,标记那些仍然被使用的对象,将未使用的对象标记为垃圾,释放这些垃圾对象的内存空间。这个过程依赖来两种主要的垃圾回收算法

  1. 标记-清除算法。垃圾回收器从根对象开始,递归标记所有可达的对象为活动对象。遍历堆内存,回收未被标记为活动对象的内存空间。
  2. 引用计数算法。每个对象有一个引用计数器,记录当前有多少个引用指向该对象,该对象被引用,引用计数器+1,引用被释放,引用计数器-1,引用计数器为0,该对象不再被引用,可以被回收。

优化:为了提高垃圾回收机制的效率,现代JavaScript引擎(V8)引入了复杂的垃圾回收机制

  1. 增量回收。将垃圾回收工作分为多个小步骤,避免长时间卡顿。
  2. 分代回收。将内存分为两代,新生代和老生代。长期存活的对象放置在老生代,垃圾回收机制频繁清理新生代中的对象。提高了垃圾回收机制的效率。

let const var

let,const声明的变量是块级变量,不存在变量提升。let声明的变量允许重新赋值,const不允许。

var声明的变量是全局变量,存在变量提升

作用域

  • 全局作用域
    • 定义:变量或者函数在整个程序中都可以被访问。 实现措施:1.函数外部使用var、let或const声明的变量将具有全局作用域。2.函数内部或函数外部不用关键字,直接赋值变量(不推荐)。 特点:全局可访问,全局作用域容易被污染 如何避免全局作用域被污染?1.使用立即执行函数。2.使用模块,ES6模块。3.谨慎使用全局变量。
  • 块级作用域
    • 定义:变量或者函数在一个代码块中有效,在代码块外无效。代码块如if语句,for语句。通过letconst关键字实现,在ES6之前,只有函数作用域。 作用:避免变量提升和闭包。
  • 函数作用域
    • 定义:定义在函数内部的变量和函数只能在函数内被访问,函数外部无法访问。函数作用域通过函数作用域链实现的。

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

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

相关文章

在Proteus软件仿真STM32F103寄存器方式PID调速电机

因为电脑中只装了IAR,所以本次编译环境就只能是IAR,所用软件版本是9.32.1。 本次仿真为,纯手写代码,不用任何库,包括启动文件也是手写。 首先是启动文件,该文件是汇编文件,命名为start.s&…

QtitanChart组件——高效、灵活的Qt数据可视化解决方案

在现代应用开发中,数据可视化已经成为不可或缺的一部分。无论是商业分析工具、财务报表、工程图表,还是科学实验数据展示,如何以直观、易理解的方式展示数据,往往决定了软件的可用性与用户体验。对于Qt开发者来说,Qtit…

YOLOv11融合[CVPR2024]Starnet中的star block特征提取模块

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Rewrite the Stars》 一、 模块介绍 论文链接:https://arxiv.org/abs/2403.19967 代码链接:https://github.com/ma-xu/Rewri…

LabVIEW农机自主导航监控系统

随着现代农业技术的快速发展,自主导航农机的需求日益增加,提高作业效率和减少劳动成本成为农业现代化的关键目标。本文介绍了一个基于LabVIEW的农机自主导航监控系统的开发案例,该系统通过先进的传感器与控制技术,实现农机在田间作…

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !

前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…

php基础:正则表达式

1.正则表达式 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。 在PHP中,正则表达式一般是由正规字…

Postman接口测试:全局变量/接口关联/加密/解密

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 全局变量和环境变量 全局变量:在postman全局生效的变量,全局唯一 环境变量:在特定环境下生效的变量,本环境内唯一 …

vue响应式数据-修改对象的属性值,视图不更新

如图: 一:问题是: 我把数据处理后能console.log()打印出来,但是页面的内容不能同步的更新渲染; 二:要求: 在数组循环列表里面,我点击单个的item按钮时,需要实时加载进度…

configure错误:“C compiler cannot create executables“

执行./configure命令出现如下奇怪的错误,百思不得姐: ./configure命令的日志文件为config.log,发生错误时,该文件的内容: This file contains any messages produced by compilers while running configure, to aid d…

【Java学习笔记】多线程基础

并行:同一时刻,多任务同时进行 多任务分别进行 一、线程相关概念 1.程序 是为完成特定任务、用某种语言编写的一组指令的集合。 简单的说:就是我们写的代码 2.进程 (1)进程指的就是运行中的程序,比如我们使用QQ,就…

PyTorch基础入门

目录 前言一、[张量的广播&基本运算](https://www.bilibili.com/video/BV1Gg411u7Lr/?spm_id_from333.999.0.0)1. 张量的广播特性2. 逐点&规约&比较运算 二、张量的线性代数运算1. BLAS & LAPACK2. 矩阵形变及特殊矩阵构造3. 矩阵基本运算4. 矩阵的线性代数运…

XXE靶机攻略

XXE-Lab靶场 1.随便输入账号密码 2.使用bp抓包 3.插入xml代码,得到结果 xxe靶机 1.安装好靶机,然后输入arp-scan -l,查找ip 2.输入ip 3.使用御剑扫描子域名 4.输入子域名 5.输入账号密码抓包 6.插入xml代码 7.使用工具解码 8.解码完毕放入文…

计算机知识笔试

一、计算机网络 1.网络分类 树型、总线型、环型一般是局域网所用的拓扑结构,广域网和远程计算机网络普遍采用网状拓扑结构。 2.OSI模型各层功能 比特、帧、端到端 3.传输层协议 TCP:传输控制协议 UDP:用户数据报协议 传输层、可靠、连接 4.网络层协议 IP协议是…

设计规规范:【App 配色】

文章目录 引言I App 配色组成色彩象征 & 联想II 知识扩展设计流程图UI设计交互设计UI交互设计引言 设计规范,保持设计一致性,提高设计效率。宏观上对内统一,管理与合作变得容易。 按类型管理颜色、文本样式、图标、组件(symbol)。 蓝湖设计规范云 https://lanhuapp.co…

计算生物学与系统生物学

计算生物学 计算生物学是一个利用数学、统计学、计算机科学和生物学知识来解决生物学问题的学科。它的核心目标是通过开发和应用计算方法来分析和解读大量的生物数据,以揭示生命现象的规律和机制。 1. 基因组学分析 计算生物学在基因组学中的应用主要集中在基因的…

timestamp 时间戳转换成日期的方法 | java.util

时间戳通常是一个long数据(注意java中赋值时需要带上L标识是long整型,否则int过长报错) 代码实现 常用工具类: java.util.Datejava.time.Instantjava.time.format.DateTimeFormatter toInstant() 方法的功能是将一个 Date 对象…

【OpenCV计算机视觉】图像处理——平滑

本篇文章记录我学习【OpenCV】图像处理中关于“平滑”的知识点,希望我的分享对你有所帮助。 目录 一、什么是平滑处理 1、平滑的目的是什么? 2、常见的图像噪声 (1)椒盐噪声 ​编辑(2) 高斯噪声 &a…

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的,所以在IDE中使用Git也是非常常用的,接下来以IDEA为例,其他的VS code ,Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…

数据可视化-1. 折线图

目录 1. 折线图适用场景分析 1. 1 时间序列数据展示 1.2 趋势分析 1.3 多变量比较 1.4 数据异常检测 1.5 简洁易读的数据可视化 1.6 特定领域的应用 2. 折线图局限性 3. 折线图代码实现 3.1 Python 源代码 3.2 折线图效果(网页显示) 1. 折线图…