JavaScript闭包的概念理解

news/2024/10/20 1:11:29

◼ 在前面我们说过,JavaScript是支持函数式编程的

◼ 在JavaScript中,函数是非常重要的,并且是一等公民:那么就意味着函数的使用是非常灵活的;函数可以作为另外一个函数的参数,也可以作为另外一个函数的返回值来使用;
◼ 所以JavaScript存在很多的高阶函数:自己编写高阶函数使用内置的高阶函数
◼ 目前在vue3+react开发中,也都在趋向于函数式编程:vue3 composition api: setup函数-> 代码(函数hook,定义函数);react:class-> function-> hooks◼ 这里先来看一下闭包的定义,分成两个:在计算机科学中和在JavaScript中。

◼ 在计算机科学中对闭包的定义(维基百科):

     闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures); 是在支持头等函数的编程语言中,实现词法绑定的一种技术; 闭包在实现上是一个结构体,它存储了一个函数和一个关联的环境(相当于一个符号查找表); 闭包跟函数最大的区别在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样即使脱离了捕捉时的上下文,它也能照常运行;◼ 闭包的概念出现于60年代,最早实现闭包的程序是Scheme,那么我们就可以理解为什么JavaScript中有闭包: 因为JavaScript中有大量的设计是来源于Scheme的;

◼ 我们再来看一下MDN对JavaScript闭包的解释:

     一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure); 也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域; 在JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来;

◼ 那么我的理解和总结:

 一个普通的函数function,如果它可以访问外层作用域的自由变量,那么这个函数和周围环境就是一个闭包;
 从广义的角度来说:JavaScript中的函数都是闭包;
 从狭义的角度来说:JavaScript中一个函数,如果访问了外层作用域的变量,那么它是一个闭包;

闭包的内存泄漏

  function createAdder(count) {function adder(num) {return count + num}return adder}var adder5 = createAdder(5)adder5(100)adder5(55)adder5(12)var adder8 = createAdder(8)adder8(22)adder8(35)adder8(7)console.log(adder5(24))console.log(adder8(30))// 永远不会再使用adder8// 内存泄漏: 对于那些我们永远不会再使用的对象, 但是对于GC来说, 它不知道要进行释放的对应内存会依然保留着adder8 = null
◼ 那么我们为什么经常会说闭包是有内存泄露的呢?在上面的案例中,如果后续我们不再使用add8函数了,那么该函数对象应该要被销毁掉,并且其引用着的父作用域AO也应该被销毁掉;但是目前因为在全局作用域下add8变量对0xb00的函数对象有引用,而0xb00的作用域中AO(0x200)有引用,所以最终会造成这些内存都是无法被释放的;所以我们经常说的闭包会造成内存泄露,其实就是刚才的引用链中的所有对象都是无法释放的;
◼ 那么,怎么解决这个问题呢?因为当将add8设置为null时,就不再对函数对象0xb00有引用,那么对应的AO对象0x200也就不可达了;在GC的下一次检测中,它们就会被销毁掉;adder8 = null

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

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

相关文章

Codeforces Round 979 (Div. 2)题解记录

比赛链接:https://codeforces.com/contest/2030 A. A Gift From Orangutan 肯定最小值和最大值放前面最好,答案得解#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>#include<unordered_set>#include&l…

AI工人操作行为流程规范识别系统

AI工人操作行为流程规范识别系统利用高清监控摄像头覆盖现场作业区域,AI工人操作行为流程规范识别系统通过图像识别和深度学习技术对作业人员的操作行为进行实时分析。AI工人操作行为流程规范识别系统能够准确识别工人的操作行为是否符合作业标准规定的流程和合规SOP,并根据设…

高级程序语言课第三次作业

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第三次个人作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13284 学号:102400115 姓名:洪育豪 作业内容:编写并运行书本第4章4.8编程练习题目中的第2题到第4题,第6题到第8题 编…

传送带下料口堵塞识别检测系统

传送带下料口堵塞识别检测系统利用AI视觉识别算法,传送带下料口堵塞识别检测系统通过现场监控摄像头对传送带的运输物料过程进行实时分析和识别。传送带下料口堵塞识别检测系统能够准确判断下料口是否出现堵塞现象,并及时抓拍有关图像进行记录。传送带下料口堵塞识别检测系统…

React/Vue 实现的前端应用, java/Go/Python 实现的后端应用,前后端分离的应用部署的最佳实践

前后端分离的应用(React 前端 + Java 后端)在部署过程中,需要考虑性能、扩展性、安全性、以及维护方便性等多个方面。下面我将详细介绍前后端分离应用的最佳实践,从架构设计、构建和打包、部署策略、CI/CD 集成、安全性措施等几个角度来描述。 微服务架构图示例壹.总体概述…

gradle配置代理

下载gradle项目 访问:https://start.spring.io/如上图所示,生成代码 配置代理服务器 买个国外的节点,使用 xshell 带代理方式连接,会暴露出 socks://localhost:1080建议开启 BBR 拥塞控制 # 要确保 linux 内核版本是4.9或更高,否则后面不用做了 uname -r # 加载 TCP BBR 模…

《使用Gin框架构建分布式应用》阅读笔记:p88-p100

《用Gin框架构建分布式应用》学习第6天,p88-p100总结,总计13页。 一、技术总结 1.MongoDB CRUD操作 (1)InsertOne(), InsertMany() (2)Find() (3)UpdateOne, UpdateMany() (4)DeleteOne(), DeleteMany() 2.MongoDB primitive p96,recipe.ID = primitive.NewObjectID() 中的…

在blender中打开pmx文件

适用blender版本: 3.6 - 4.0 - 4.1 - 4.2 等 本人使用的blender版本为3.6 和 4.2 这里用3.6作案例下载cats插件在github中查找cats-blender-plugin 比如说这个:https://github.com/absolute-quantum/cats-blender-plugin下载最新的插件 注意: 插件版本只对应相应的blender版本…