当前位置: 首页 > news >正文

力扣 30 天 JavaScript 挑战 第二题笔记

这道题是

在这里插入图片描述

涉及知识–闭包

1. 闭包定义以及相关知识点

官方定义为:在 JavaScript 中,函数具有对在相同作用域以及任何外部作用域中声明的所有变量的引用。这些作用域被称为函数的 词法环境。函数与其环境的组合被称为 闭包。
简单理解:内层函数+引用的外层函数变量。下图的a变量以及f函数就构成了闭包。
在这里插入图片描述

但是这样外部(这个外部是相对于outer而不是f)不可以使用闭包里面的变量,此时需要return。

function outer(){let a = 1function f(){return a;}f()
}
const result = outer()

这样通过返回闭包里的函数,外部可以访问到a的值,实现了变量的私有化(在outer函数的外部不可以修改a的值,只能访问a的值)。
但是这样同样造成了内存泄露,因为一般来说函数执行完毕后,会立刻被回收,但是现在讲f赋值给了一个全局变量,不会被回收,造成了内存泄露。

2. 闭包vs类

上述函数类的写法为

class outer {constructor() {this.a = 1;}add() {return this.a;}
}
const result = new outer()
  • 闭包和类的共同点
    都允许你定义或者传入一个私有数据,并且提供一个函数使用私有数据。
  • 闭包的优势 封装
    类里面可以通过 result.a=3来修改私有变量,但是闭包不可以。
  • 类的优势 节省内存
    类的方法存在“公共仓库”(原型对象)里,所有实例来借用。闭包每次造一个新实例,就重新拷贝一份方法。

答案

理解了闭包就很简单了

/*** @param {number} n* @return {Function} counter*/
var createCounter = function (n) {return function () {return n++};
};/** * const counter = createCounter(10)* counter() // 10* counter() // 11* counter() // 12*/
http://www.lryc.cn/news/615641.html

相关文章:

  • 服务器硬件电路设计之I2C问答(二):I2C总线的传输速率与上拉电阻有什么关系?
  • 常用信号深度解析(SIGINT、SIGPIPE、SIGALRM、SIGTERM等)
  • Java安全-组件安全
  • 谷歌搜索 sg_ss 逆向分析
  • nginx的安装
  • 智能的本质
  • Linux之shell脚本篇(四)
  • 【工具变量】地市人力资本水平数据集(2003-2023年)
  • 9. 堆和栈有什么区别
  • 健全性测试(Sanity Testing):你软件的快速“体检” ✅(省时避坑,确保核心!)
  • PID学习笔记1
  • 复现论文关于3-RPRU并联机器人运动学建模与参数优化设计
  • QT环境搭建
  • 功能测试中常见的面试题-二
  • 【Python 高频 API 速学 ⑥】
  • 09 【C++ 初阶】C/C++内存管理
  • [激光原理与应用-207]:光学器件 - 光纤种子源激光器常用元器件
  • Linux文件系统基石:透彻理解inode及其核心作用
  • 【高等数学】第八章 向量代数与空间解析几何——第四节 空间直线及其方程
  • 分析报告:基于字节连续匹配技术的KV缓存共享实施可能性及其扩展
  • 【机器学习深度学习】模型选型:如何根据模型的参数算出合适的设备匹配?
  • 202506 电子学会青少年等级考试机器人二级理论综合真题
  • 202506 电子学会青少年等级考试机器人三级器人理论真题
  • openvela之STM32开发板部署
  • LLM表征的提取方式
  • EP06:【DL 第二弹】动态计算图与梯度下降入门
  • UCMT部分复现
  • Chaos Monkey 故障注入工具使用介绍
  • Spring Boot Starter 自动化配置原理深度剖析
  • CentOS7编译安装GCC