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

大白话JavaScript闭包在实际项目中有哪些应用场景?

大白话JavaScript闭包在实际项目中有哪些应用场景?

闭包是指有权访问另一个函数作用域中的变量的函数。在实际项目中,闭包有很多应用场景,以下是一些常见的例子:

数据封装和隐私保护

  • 场景:在开发中,有时希望某些数据只能在特定的函数内部被访问和修改,对外界是隐藏的,就像把一些东西放在一个私密的小房间里,只有特定的方法才能进去操作它们。
  • 示例
function createCounter() {
    // 私有变量,外部无法直接访问
    let count = 0; 

    return {
        // 可以访问和修改count的函数
        increment() { 
            count++;
            console.log(count);
        },
        getCount() { 
            return count;
        }
    };
}

const counter = createCounter();
counter.increment(); 
console.log(counter.getCount()); 
  • 解释:在这个例子中,count 变量被封装在 createCounter 函数内部,通过闭包,incrementgetCount 函数可以访问和操作 count,但外部代码无法直接访问 count,实现了数据的封装和隐私保护。

函数柯里化

  • 场景:当有一个函数需要接收多个参数,但有时希望先传递一部分参数,然后在后续的操作中再传递剩下的参数,就好像分批处理参数一样。
  • 示例
function add(x) {
    return function(y) {
        return x + y;
    };
}

const add5 = add(5);
console.log(add5(3)); 
  • 解释:这里的 add 函数返回了一个内部函数,内部函数可以访问 add 函数的参数 x,形成了闭包。通过这种方式,可以先固定一个参数,然后再传入另一个参数进行计算,提高了函数的灵活性和复用性。

事件处理函数

  • 场景:在网页开发中,给按钮等元素添加点击事件时,常常需要在事件处理函数中保存一些状态信息。
  • 示例
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <button id="btn">点击我</button>

    <script>
        function createClickHandler(message) {
            return function() {
                console.log(message);
            };
        }

        const btn = document.getElementById('btn');
        // 创建点击事件处理函数,并传入特定的消息
        const clickHandler = createClickHandler('按钮被点击了!'); 
        btn.addEventListener('click', clickHandler);
    </script>

</body>

</html>
  • 解释createClickHandler 函数返回的事件处理函数通过闭包记住了传入的 message 参数。当按钮被点击时,就能正确地显示出相应的消息,即使 createClickHandler 函数已经执行完毕,message 参数也不会被释放。

缓存数据

  • 场景:在一些需要频繁计算或获取数据的场景中,希望把计算结果或获取到的数据缓存起来,下次需要时直接使用,避免重复计算或请求。
  • 示例
function dataFetcher() {
    // 用于缓存数据的对象
    let cache = {}; 

    return function(url) {
        if (cache[url]) {
            // 如果数据已经在缓存中,直接返回缓存中的数据
            return cache[url]; 
        } else {
            // 假设这里是实际的网络请求获取数据
            const data = fetchDataFromServer(url); 
            // 将获取到的数据存入缓存
            cache[url] = data; 
            return data;
        }
    };
}

const fetchData = dataFetcher();
const data1 = fetchData('https://example.com/api/data1');
const data2 = fetchData('https://example.com/api/data2');
const data1Again = fetchData('https://example.com/api/data1'); 

function fetchDataFromServer(url) {
    // 这里模拟从服务器获取数据
    console.log(`从服务器获取数据:${url}`);
    return `模拟数据:${url}`;
}
  • 解释dataFetcher 函数内部创建了一个 cache 对象来缓存数据,返回的函数通过闭包可以访问和操作 cache。当多次请求相同的 url 时,第二次及以后就可以直接从缓存中获取数据,提高了性能。

相关文章:

  • Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)
  • 减速机的工作原理具体是如何实现的?
  • 手机放兜里,支付宝“碰一下”被盗刷?
  • ALM研发管理:全新甘特图,让项目管理更高效
  • 信号系统篇---欧拉公式角度表示方法
  • 期权帮|股指期货基差和价差有什么区别?
  • HC32F460_SCI驱动(一)
  • Ubutu部署WordPress
  • 数据中心设备故障难预测?智能预警系统为您排忧解难!
  • C++ Qt常见面试题(2):QT中的文件流(QTextStream)和数据流(QDataStream)的区别
  • EB-Cable许可分析的定义和目的
  • 机试刷题_1614. 括号的最大嵌套深度【python】
  • 跟着 Lua 5.1 官方参考文档学习 Lua (9)
  • 《操作系统 - 清华大学》 8 -10:进程管理:线程的实现
  • 营销过程乌龟图模版
  • Linux中的UDP编程接口基本使用
  • 流匹配(Flow Matching)的生成过程:求解反向常微分方程(ODE)
  • 单例模式——c++
  • JavaScript将:;隔开的字符串转换为json格式。使用正则表达式匹配键值对,并构建对象。多用于解析cssText为style Object对象
  • 基础知识|原型在什么时候用和类的区别
  • 两部门发布山洪灾害气象预警:北京西部、河北西部等局地山洪可能性较大
  • 现场丨“影像上海”启幕:串联摄影、电影与当代艺术
  • 纪录片《中国》原班人马打造,《船山先生》美学再升级
  • 咖啡戏剧节举办第五年,上生新所“无店不咖啡,空间皆可戏”
  • 美联储宣布维持基准利率不变
  • 安徽六安原市长潘东旭,已任省市场监督管理局党组书记、局长