当前位置:首页 > 科技  > 软件

JavaScript中闭包的四个有用技巧

来源: 责编: 时间:2023-10-26 17:12:03 208观看
导读本文转载自微信公众号「黑土豆的前端博客」,作者Maybe007。转载本文请联系黑土豆的前端博客公众号。
前言当谈到JavaScript编程中的高级概念和技巧时,闭包(Closures)是一个重要而有趣的主题。闭包是一种函数与其创建时的

本文转载自微信公众号「黑土豆的前端博客」,作者Maybe007。转载本文请联系黑土豆的前端博客公众号。
RaD28资讯网——每日最新资讯28at.com

前言

当谈到JavaScript编程中的高级概念和技巧时,闭包(Closures)是一个重要而有趣的主题。闭包是一种函数与其创建时的词法环境的组合,它允许我们捕获和保留局部变量,并在函数之外使用它们。在这篇文章中,我们将深入探讨JavaScript中闭包的4种有用技巧,以及如何应用它们来解决各种问题和提高代码质量。RaD28资讯网——每日最新资讯28at.com

1. 解决循环中的问题

在JavaScript中,循环中的变量作用域问题经常会导致预期之外的结果。通常,使用var声明变量会导致循环中的变量共享相同的作用域,因此在异步操作中,这些变量可能会具有意外的值。RaD28资讯网——每日最新资讯28at.com

问题场景:RaD28资讯网——每日最新资讯28at.com

for (var i = 0; i < 3; i++) {    setTimeout(() => {        console.log(i); // 输出什么?    }, 1000 * i);}

上述代码将在1秒、2秒和3秒后分别打印出3,三次都是相同的值。这是因为setTimeout是异步的,它在循环结束后才执行,此时i的值已经是3。RaD28资讯网——每日最新资讯28at.com

解决方法:RaD28资讯网——每日最新资讯28at.com

使用闭包来保存每次迭代中的i的值:RaD28资讯网——每日最新资讯28at.com

for (var i = 0; i < 3; i++) {    ((n) => {        setTimeout(() => {            console.log(n); // 输出0、1、2        }, 1000 * n);    })(i);}

或者,更简单的方式是使用let来声明循环变量,它将在每次迭代中创建一个新的作用域:RaD28资讯网——每日最新资讯28at.com

for (let i = 0; i < 3; i++) {    setTimeout(() => {        console.log(i); // 输出0、1、2    }, 1000 * i);}

这2种方法都可以解决循环中的作用域问题。RaD28资讯网——每日最新资讯28at.com

2. 保存函数状态

闭包还可以用于实现记忆功能,通过缓存计算结果来提高性能。这在需要重复计算的函数中特别有用。RaD28资讯网——每日最新资讯28at.com

问题场景:RaD28资讯网——每日最新资讯28at.com

实现一个累加器:RaD28资讯网——每日最新资讯28at.com

let sum = 1;function add(num) {    sum += num;    return sum;}console.log(add(1));console.log(add(5));

每次调用add时,它都会将上次的值保存下来。但是这段代码有潜在的问题,那就是sum可能会被其他部分代码无意中修改。那如何解决?RaD28资讯网——每日最新资讯28at.com

解决方法:RaD28资讯网——每日最新资讯28at.com

使用闭包就可以规避上面存在的问题且可以缓存已经计算的值:RaD28资讯网——每日最新资讯28at.com

function calculator(val) {    let sum = val;    return function(num) {        sum += num;        return sum;    }}const add = calculator(1);console.log(add(1)); //2console.log(add(5)); //7

每次调用返回的函数时,它都会将传递给它的数字加到总和中,并返回新的总和。RaD28资讯网——每日最新资讯28at.com

3. 封装私有变量和属性

在过去,为了保护对象的私有变量,常常使用闭包。通过闭包,可以将变量封装在函数内部,只能通过函数暴露的接口来访问和修改。RaD28资讯网——每日最新资讯28at.com

问题场景:RaD28资讯网——每日最新资讯28at.com

function add() {    let count = 0;    count++;    console.log(count);}add(); //输出1add(); //输出1add(); //输出1

调用函数,输出的结果都是1,但是显然我们想要的效果是让count每次加1的。那如何解决呢?RaD28资讯网——每日最新资讯28at.com

解决方法:RaD28资讯网——每日最新资讯28at.com

使用闭包来封装私有变量:RaD28资讯网——每日最新资讯28at.com

function add(){    let count = 0;    function a() {        count++;        console.log(count);    }    return a;}var res = add();res() //1res() //2res() //3

add函数返回了一个闭包a,其中包含了count变量。由于count只在add函数内部定义,因此外部无法直接访问它。但是,由于a函数引用了count变量,因此count变量的值可以在闭包内部被修改和访问,这样就可以防止它被恶意修改了。RaD28资讯网——每日最新资讯28at.com

4. 函数柯里化

函数柯里化是一种将接受多个参数的函数转化为一系列接受一个参数的函数的过程。这也可以通过闭包来实现。RaD28资讯网——每日最新资讯28at.com

问题场景:RaD28资讯网——每日最新资讯28at.com

const add = (a, b, c) => {    return a + b + c;}console.log(add(2, 3, 4)); // 输出9

解决方法:RaD28资讯网——每日最新资讯28at.com

使用闭包来实现函数柯里化:RaD28资讯网——每日最新资讯28at.com

function curry(callback) {    const args = [];    return function curried(...newArgs) {        args.push(...newArgs);        if (args.length >= callback.length) {            return callback(...args);        } else {            return curried;        }    };}function add(a, b, c) {    return a + b + c;}const curriedAdd = curry(add);console.log(curriedAdd(2)(3)(4)); // 输出 9

函数柯里化使函数更加灵活,能够逐步接受参数,提高代码的可重用性和可读RaD28资讯网——每日最新资讯28at.com

总结

在本文中,我们深入探讨了JavaScript中闭包的4种有用技巧,以及如何应用它们来解决各种问题和提高代码质量。这些技巧包括解决循环中的变量作用域问题,实现记忆功能以提高性能,封装私有变量和属性,以及使用函数柯里化来提高函数的灵活性。RaD28资讯网——每日最新资讯28at.com

闭包是JavaScript中一个强大的概念,它允许我们在函数之外访问和操作局部变量,从而解决了许多常见的编程问题。虽然闭包在JavaScript中有着广泛的应用,但也需要小心使用,以避免潜在的内存泄漏问题。确保在不再需要闭包时,及时释放对其的引用,以帮助垃圾回收器正常运作。希望本文对你理解JavaScript中的闭包和如何应用它们有所帮助。RaD28资讯网——每日最新资讯28at.com

本文转载自微信公众号「黑土豆的前端博客」,可以通过以下二维码关注。转载本文请联系公众号。RaD28资讯网——每日最新资讯28at.com

RaD28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15223-0.htmlJavaScript中闭包的四个有用技巧

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: JCStress—验证你的并发程序是否正确

下一篇: 别再学那些落后的 Web 开发技术了 !

标签:
  • 热门焦点
  • K8S | Service服务发现

    K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 企业采用CRM系统的11个好处

    企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 慕岩炮轰抖音,百合网今何在?

    慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 认真聊聊东方甄选:如何告别低垂的果实

    认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top