前端面经每日一题Day14

news2024/12/19 15:12:12

闭包

定义:闭包是指在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.coloradmin.cn/o/2262233.html

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

相关文章

画一颗随机数

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>codePen - Random Tree</title> </head> <body><canvas></canvas><script>const canvas doc…

牛客周赛 Round 72 题解

本次牛客最后一个线段树之前我也没碰到过&#xff0c;等后续复习到线段树再把那个题当例题发出来 小红的01串&#xff08;一&#xff09; 思路&#xff1a;正常模拟&#xff0c;从前往后遍历一遍去统计即可 #include<bits/stdc.h> using namespace std; #define int lo…

[x86 ubuntu22.04]投影模式选择“只使用外部”,外部edp屏幕无背光

1 问题描述 CPU&#xff1a;G6900E OS&#xff1a;ubuntu22.04 Kernel&#xff1a;6.8.0-49-generic 系统下有两个一样的 edp 屏幕&#xff0c;投影模式选择“只使用外部”&#xff0c;内部 edp 屏幕灭&#xff0c;外部 edp 屏幕无背光。DP-1 是外部 edp 屏幕&#xff0c;eDP-1…

清理C盘小记

突然C盘就爆满了&#xff0c;想当初还是给他预留了120G的空间&#xff0c;感觉到现在也不够用了&#xff0c;担心出现死机的情况就赶紧进行了清理。有一说一&#xff0c;清理回收站是真的有用。 参考&#xff1a;C盘清理指南&#xff0c;清理出30G起&#xff0c;超详细总结&am…

Docker:Docker Compose(补充三)

Docker&#xff1a;Docker Compose 1. Docker Compose 批量管理容器的工具 1. Docker Compose 批量管理容器的工具 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用服务&#xff0c;它允许用户编排、组合和配置多个容器的部署…

lightRAG 论文阅读笔记

论文原文 https://arxiv.org/pdf/2410.05779v1 这里我先说一下自己的感受&#xff0c;这篇论文整体看下来&#xff0c;没有太多惊艳的地方。核心就是利用知识图谱&#xff0c;通过模型对文档抽取实体和关系。 然后基于此来构建查询。核心问题还是在解决知识之间的连接问题。 论…

Visual studio的AI插件-通义灵码

通义灵码 TONGYI Lingma 兼容 Visual Studio、Visual Studio Code、JetBrains IDEs 等主流 IDE&#xff1b;支持 Java、Python、Go、C/C、C#、JavaScript、TypeScript、PHP、Ruby、Rust、Scala 等主流编程语言。 安装 打开扩展管理器&#xff0c;搜送“TONGYI Lingma”&…

shutil 文件拷贝copy - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

attack xv6

思路 被这个实验折磨了两天&#xff0c;可能是2024新出的一个实验内容&#xff0c;网上资料少&#xff0c;参考了一篇仅有的博客&#xff0c;吭哧吭哧分析出来了个大概吧…在此记录一下&#xff0c;以便帮助有需要的人。 attack xv6的ans只有几行代码&#xff0c;根据实验描述…

Flink CDC实时同步mysql数据

官方参考资料&#xff1a; https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/mysql-cdc/ Apache Flink 的 Change Data Capture (CDC) 是一种用于捕获数据库变化&#xff08;如插入、更新和删除操作&#xff09;的技术。Flink CDC…

eclipse 如何设置项目、不同类型文件的 utf8 编码

编码问题一直是软件开发中让人头疼的小细节&#xff0c;尤其是团队协作中&#xff0c;若编码格式不统一&#xff0c;乱码问题便会频繁出现。那么如何在 Eclipse 中统一设置项目和文件的 UTF-8 编码&#xff0c;避免因编码问题造成不必要的困扰呢&#xff1f;今天&#xff0c;我…

Unity中触发器Trigger无法被射线检测到的问题

今天在做项目的时候发现,同一个物体,当他是碰撞器的时候,可以被射线检测到. 但是当他变成触发器的时候,射线就检测不到了??? 本来以为就是这样的,但是查了资料发现并没有这样的限制,触发器也是可以正常被射线检测的 到处查资料都没有发现问题,后来发现是下面这个设置不知道…

第一个AJAX调用XMLHttpRequest

第一个AJAX调用XMLHttpRequest 创建对象&#xff0c;用于浏览器和服务器的通信&#xff0c;不需要刷新浏览器 const request new XMLHttpRequest();通过GET请求方式在API中请求数据 request.open(GET, https://restcountries.com/v3.1/name/Russia);注&#xff1a;我这里的…

群落生态学研究进展】Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…

如何在 Apifox 中发布多语言的 API 文档?

“API 文档是开发协作的桥梁&#xff0c;而多语言支持则让这座桥梁跨越更多的技术边界。使用 Apifox&#xff0c;不仅可以快速生成 API 文档&#xff0c;还能轻松实现多语言的支持与发布。今天&#xff0c;我们一起来探索 Apifox 在多语言文档发布中的最佳实践&#xff01;” …

华为云检查服务器状态

VNC方式登录云服务器正常&#xff0c;但无法通过远程桌面连接方式登录云服务器时&#xff0c;推荐您按照以下思路排查问题。 以下排查思路根据原因的出现概率进行排序&#xff0c;建议您从高频率原因往低频率原因排查&#xff0c;从而帮助您快速找到问题的原因。 如果解决完某…

leetcode212. 单词搜索 II

给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。 单词必须按照字母顺序&#xff0c;通过 相邻的单元格 内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一…

无缝钢管内表面缺陷检测的自强化感知协调网络

摘要 无缝钢管是重要的工业材料。然而&#xff0c;无缝钢管中的内表面缺陷检测具有挑战性&#xff0c;并且会显著影响无缝钢管的性能和寿命。现有的检测方法是劳动强度大的&#xff0c;并且检测结果的可视化程度低。因此&#xff0c;本文提出了一种新型的管道内表面缺陷螺旋式全…

Kioptrix靶场渗透--level1.1

目录 环境搭建 镜像包下载 下载后解压&#xff0c;并修改配置 开始渗透 获取IP 获取具体服务 尝试sql注入 尝试命令执行 反弹shell 提权 查看Linux的内核版本 下载脚本 将脚本上传至靶机 编译脚本 编译后执行 第一个脚本失败&#xff0c;再找个脚本 使用cat /…