前端面试题-什么是JavaScript的闭包?有哪些应用场景?

news/2024/9/19 15:11:48/ 标签: 前端, javascript, 开发语言

定义:

一个函数能够访问其它函数内部定义的变量

形成的原理:

(1)函数创建:在一个函数(外部函数)中定义另一个函数(内部函数)。

(2)内部函数访问:内部函数可以访问和修改外部函数中的局部变量。

(3)函数执行:外部函数执行并返回内部函数时,外部函数的作用域(包括其中的变量)不会被销毁,因为内部函数依然持有对这些变量的引用。

使用场景:

(1)回调函数

闭包可以用作回调函数,在异步操作完成后执行。

function fetchData(callback) {setTimeout(() => {let data = 'Some data';callback(data);}, 1000);
}fetchData((result) => {console.log(result); // 输出: Some data
});

(2)定时器传参

闭包可以在定时器中使用,以传递和维护参数。

function startTimer(seconds) {setTimeout(() => {console.log(`Time's up! ${seconds} seconds elapsed.`);}, seconds * 1000);}startTimer(5); // 输出: Time's up! 5 seconds elapsed.

(3)防抖和节流

防抖和节流函数使用闭包来缓存状态和实现优化。

防抖:在事件停止触发后才执行函数。

function debounce(func, delay) {let timer;return function(...args) {clearTimeout(timer);timer = setTimeout(() => func.apply(this, args), delay);};
}const handleResize = debounce(() => {console.log('Resize event handled!');
}, 300);window.addEventListener('resize', handleResize);

节流:限制函数的执行频率。

function throttle(func, limit) {let lastFunc;let lastRan;return function(...args) {if (!lastRan) {func.apply(this, args);lastRan = Date.now();} else {clearTimeout(lastFunc);lastFunc = setTimeout(() => {if (Date.now() - lastRan >= limit) {func.apply(this, args);lastRan = Date.now();}}, limit - (Date.now() - lastRan));}};
}const handleScroll = throttle(() => {console.log('Scroll event handled!');
}, 1000);window.addEventListener('scroll', handleScroll);

(4)封装私有变量和函数

使用闭包来创建私有变量和函数。​​​​​​​

function createCounter() {let count = 0;return {increment: function() {count++;console.log(count);},decrement: function() {count--;console.log(count);}};
}const counter = createCounter();
counter.increment(); // 输出: 1
counter.increment(); // 输出: 2
 

(5)缓存

闭包可以用于实现简单的缓存机制。

function createCache() {let cache = {};return function(key, value) {if (value !== undefined) {cache[key] = value;}return cache[key];};
}const cache = createCache();
cache('name', 'John');
console.log(cache('name')); // 输出: John

(6)高阶函数

高阶函数是接受函数作为参数或返回函数的函数

function makeMultiplier(multiplier) {return function(value) {return value * multiplier;};
}const double = makeMultiplier(2);
console.log(double(5)); // 输出: 10

补充一个问题:闭包一定会造成内存泄露吗?

不一定,只有内部的函数保留到外部,在外部执行时才会造成内存泄露

以上是个人的一些理解,如有不足欢迎评论区留言,下期见~


http://www.ppmy.cn/news/1511586.html

相关文章

Spring Cloud Eureka快速搭建:微服务注册中心的配置步骤

Spring Cloud Eureka快速搭建:微服务注册中心的配置步骤 目录 引言Spring Cloud微服务架构概述什么是Eureka?Eureka Server的搭建步骤 4.1 创建Eureka Server项目4.2 配置Eureka Server4.3 启动Eureka Server4.4 多实例Eureka Server的搭建 Eureka Cli…

无人机电池充电器技术详解

随着无人机技术的飞速发展,其作为航拍、物流、农业、监测等多领域的重要工具,对电池续航能力和充电效率提出了更高要求。无人机电池充电器作为保障无人机长时间运行的关键设备,其技术水平的提升直接影响到无人机的使用效率和安全性。本文将从…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

【Solidity】基础介绍

数据类型 值类型 值类型的变量在赋值或作为函数参数传递时会被复制。 布尔类型:bool整数类型: 无符号:uint8、uint16、…、uint256 (uint256 可简写为 uint)有符号:int8、int16、…、int256 (int256可简写为 int) 地址类型&…

Unity的物理系统

目录 3D 物理系统 主要组件 2D 物理系统 主要组件 物理引擎的选择与应用 物理模拟的控制与优化 Unity中Nvidia PhysX引擎与Box2D引擎在性能和功能上的具体比较是什么? 如何在Unity项目中实现Havok物理引擎,并与PhysX或Box2D引擎结合使用&#xf…

像素尺寸物理尺寸分辨率

同样尺寸的图片(如448448像素)的确会有相同的像素数量,但分辨率的概念不仅仅取决于像素数,还包括图像在物理世界中的显示或打印尺寸。因此,像素尺寸相同的图片在不同的物理尺寸下显示时,分辨率可以不同。 …

UE5.4 用自带OpenCV4.55读取png、MP4、摄像头并在ui中显示的方法

创建c项目,项目build.cs中开启模块: // Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;public class OpencvT : ModuleRules {public OpencvT(ReadOnlyTargetRules Target) : base(Target){PCHUsage PCHUsageMode.UseExplici…

Kali Linux 命令大全

一、引言 Kali Linux 作为一款专为渗透测试和安全研究设计的操作系统,拥有丰富的命令行工具,熟练掌握这些命令对于高效地进行安全测试和分析至关重要。本文将为您详细介绍 Kali Linux 中常用的命令,涵盖系统信息获取、文件操作、网络分析、用…

Vue3 组件命名

最简单的方式 无须引入插件,可直接命名(缺点,可能就是丑了) // 组件命名 defineOptions({name: Menu}) 优雅的命名方式 安装 vite-plugin-vue-setup-extend 插件 npm i vite-plugin-vue-setup-extend -D vite-plugin-vue-se…

分布式数据库在传统车联网厂商的应用实践 | OceanBase案例

本文作者:慧视通科技,梁君 传统车联网厂商运维百亿级数据的痛点与难点 深圳慧视通科技(简称慧视通)作为专业的位置数据综合运营服务提供商,一直深耕智能交通领域,依托车联网、云计算、大数据处理、无线通信…

Go语言 类封装和绑定方法

本篇文章主要内容为Go语言类相关操作:封装和绑定方法介绍及示例。 目录 封装 绑定方法 类方法形参 指针形参 设置类方法参数 指针与非指针区别 总结 封装 go语言支持类的操作,但是没有class关键字,使用struct来模拟类。 示例如下&am…

Java - File、IO流

File类 File是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、文件夹) File类只能对文件本身进行操作,不能读写文件里面存储的数据。 创建File类的对象: //创建file对象//1.具体…

嵌入式八股-操作系统面试30题(20240817)

计算机的五大单元是什么? 运算器:执行算术和逻辑运算,如加法、减法、与或非等操作。控制器:控制和协调计算机各部件的工作,解释和执行指令。存储器:存储数据和程序,包括主存储器(RAM…

[vue] pdf.js / vue-pdf 文件花屏问题

vue-pdf内核也是pdf.js&#xff0c;修改方式一样 在pdf.worker.js中加入几行代码&#xff0c;追加到”precinct.zeroBitPlanesTree zeroBitPlanesTree;“之后。 for (var l 0; l < layerNumber; l) {if (readBits(1) ! 0) {throw new JpxError("Invalid tag tree&qu…

对比state和props的区别?

在React中&#xff0c;state和props是两个核心概念&#xff0c;它们都用于管理组件的数据和状态&#xff0c;但在使用和作用上存在明显的区别。以下是它们之间的详细对比&#xff1a; 1. 定义与来源 props&#xff08;属性&#xff09;&#xff1a; 定义&#xff1a;props是组…

线上研讨会 | CATIA助力AI提升汽车造型设计

报名链接&#xff1a; 2024探索之旅第二季

谷粒商城实战笔记-211~212-商城业务-认证服务-环境搭建

这一部分的主要内容是开发商城的认证服务。 文章目录 一&#xff0c;211-商城业务-认证服务-环境搭建1&#xff0c;创建模块2&#xff0c;引入相关依赖3&#xff0c;各种配置3.1 注册中心配置3.2 启用注册中心3.3 本节域名配置 4&#xff0c;页面模板4.1 html模板4.2 静态资源上…

搜维尔科技:驾驶模拟器背后的技术: Varjo的虚拟/混合现实 (VR/XR)提供独特的优势,最终加快汽车开发创新的步伐

专业驾驶模拟器广泛应用于车辆开发&#xff0c;帮助汽车行业在开发过程的早期做出更好的设计决策。总体目标是为测试驾驶员提供最真实的驾驶体验&#xff0c;包括动态动作和声音&#xff0c;并测试控制算法或辅助系统等功能。环境越真实&#xff0c;驾驶员的体验就越接近最终车…

springboot整合springmvc

1、创建springboot项目&#xff0c;勾选Spring web 当前springboot选择的是2.6.13版本&#xff0c;jdk1.8尽量选2.几的springboot 2、在pom.xml中导入相应的坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

微服务设计原则——高性能:批量

能批量就不要并发。 如果调用方需要调用我们接口多次才能进行一个完整的操作&#xff0c;那么这个接口设计就可能有问题。 比如获取数据的接口&#xff0c;如果仅仅提供getData(int id)接口&#xff0c;那么使用方如果要一次性获取 20 个数据&#xff0c;它就需要循环遍历调用…