当前位置: 首页 > 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.dtcms.com/a/322785.html

相关文章:

  • 每日算法刷题Day59:8.9:leetcode 队列8道题,用时2h30min
  • 【攻防实战】从外到内全链路攻防实战纪实
  • python---类型别名
  • 1073. 沙漏
  • sqli-labs通关笔记-第40关 GET字符型堆叠注入(单引号括号闭合 手工注入+脚本注入两种方法)
  • J2000平赤道系、瞬时平赤道系与瞬时真赤道系
  • (论文速读)重新思考CNN生成网络中的上采样操作
  • 优先队列,链表优化
  • 2025-08-09通过授权码的方式给exe程序充值
  • 如何搭建ELK
  • C# DataGridView 添加进度条
  • 五、RuoYi-Cloud-Plus 前端项目部署以及如何改后端请求地址。
  • 《从零实现哈希表:详解设计、冲突解决与优化》
  • 09 【C++ 初阶】C/C++内存管理
  • 容器技术基础与实践:从镜像管理到自动运行配置全攻略
  • 【机器学习深度学习】模型选型:如何根据模型的参数算出合适的设备匹配?
  • Java 字符流与字节流详解
  • bms部分
  • 系统调用性能剖析在云服务器应用优化中的火焰图生成方法
  • 比亚迪第五代DM技术:AI能耗管理的深度解析与实测验证
  • Klipper-G3圆弧路径算法
  • Android MediaCodec 音视频编解码技术详解
  • 排序概念以及插入排序
  • Docker部署whisper转写模型
  • AI鉴伪技术:守护数字时代的真实性防线
  • 软件工程总体设计:从抽象到具体的系统构建之道
  • Python爬虫实战:研究PSpider框架,构建电商数据采集和分析系统
  • (LeetCode 每日一题) 231. 2 的幂 (位运算)
  • Python NumPy入门指南:数据处理科学计算的瑞士军刀
  • Redis缓存详解:内存淘汰和缓存的预热、击穿、雪崩、穿透的原理与策略