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

前端面试题-什么是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.lryc.cn/news/427486.html

相关文章:

  • Xilinx XAPP585相关
  • Java实现腾讯云人脸识别集成:如何为司机创建人脸模型
  • 微信小程序电话号码授权
  • vue3 响应式 API:ref() 和 reactive()
  • 英智金融行业AI Agent,在金融领域全场景下的业务创新与应用实践
  • hyper-v安装window10操作系统
  • 华三(H3C)UIS3030 Uni-R4900服务器硬件监控指标解读
  • opencv 控制鼠标键盘实现功能setMouseCallback
  • 【傅里叶分析】复数基础知识
  • 从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革
  • 基于YOLOv10深度学习的草莓成熟度检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、人工智能
  • log4j日志配置%X{TransId}
  • PHP模拟高并发异步请求测试+redis的setnx处理并发和防止死锁处理
  • 访问网站出现“此站点不安全”如何解决
  • 同一台电脑同时连接使用Gitee(码云)和Github
  • GORM 插入和批量插入操作介绍
  • 企业CAD图纸加密软件推荐!2024年好用的10款CAD图纸加密软件排行
  • 智能电梯标志新时代:墨水屏电子标签引领变革
  • 使用nvm下载nodejs版本报错
  • 深入理解CSS的:valid和:invalid伪类:增强表单验证的艺术
  • 稚晖君发布5款全能人形机器人,开源创新,全能应用
  • 【总结】冲击偶的概念与性质
  • Hbase图形化界面
  • PhalApi:在宝塔一键安装部署PHP开源接口框架的教程
  • 什么是BERT?工程快速入门
  • SQL - 事务
  • 系统, 安装完以后只能进ubuntu
  • 闲鱼功能全解析:闲置物品快速变现
  • 牛客网SQL进阶129 :月均完成试卷数不小于3的用户
  • Astro + Cloudflare Pages 快速搭建个人博客