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

JavaScript闭包

目录

目标

语法结构

应用场景

数据隐藏和封装

函数柯里化

异步延迟回调


目标

        了解闭包的语法结构与应用场景。了解Python的同学可以对比一下我之前写的Python闭包文章,两者非常相似。


语法结构

        以下两种书写方式是等价的。

//方式一
function outer(){
    function inner(){
        
    }
    return inner
}
//方式二
function outer(){
    return function inner(){
        
    }
}

应用场景

数据隐藏和封装

需求

        在环境监测项目中,我们需要定期获取气象数据(比如:降雨量)。这些数据十分敏感,我们可以使用闭包来封装和隐藏这些数据,确保它们只能通过合法的方式进行访问或修改。

function create_rain_sensor(init_value){
    function update_init_value(){
        if (init_value<0){
            init_value=null
        }else{
            //四舍五入保留2位小数
            init_value = Number(init_value.toFixed(2));
        }
        console.log(init_value)
    }
    return update_init_value
}

// 创建雨量传感器并初始化为 -1
const rainSensor = create_rain_sensor(-1);
rainSensor();  // 输出 null

// 创建雨量传感器并初始化为 12.3456
const rainSensor2 = create_rain_sensor(12.3456);
rainSensor2();  // 输出 12.35

函数柯里化

        柯里化是将多个参数的函数转换为单一参数的函数,并且返回每个单一参数函数,直到所有参数都被提供。这对于延迟执行和函数组合非常有用。

需求一

        返回两个数字相乘的结果。

function outer(a){
    return function inner(b){
        return a*b
    }
}

const inner=outer(2)
//避免重复传递参数。
console.log(inner(6))
console.log(inner(7))
console.log(inner(8))

需求二

        绑定li的点击事件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图书馆</title>
    
</head>
<body>

    <h1>小说</h1>
    <ul>
        <li>凡人修仙传</li>
        <li>诛仙</li>
        <li>鹿鼎记</li>
        <li>天龙八部</li>
    </ul>

    <script>
        let allLi=document.querySelectorAll("li")
        for(var i=0;i<allLi.length;i++){
            allLi[i].onclick=(
                function(index){
                    return function(){
						alert("点击了第"+index+"个li标签。")
                    }
                }
            )(i)
        }
    </script>

</body>
</html>

异步延迟回调

        异步执行过程中可能会导致变量被污染,比如下面的代码,每次都输出相同的结果:

//这里先不考虑使用let创建变量。
for (var i = 1; i <= 3; i++) {
    setTimeout(function () {
        //第 4 次执行
        console.log(`第 ${i} 次执行`);  
    }, i * 1000);
}

需求

        使用闭包将上述案例修改正确。

for (var j = 0; j <= 3; j++) {
    (function (index) {
        setTimeout(function () {
            console.log(`第 ${index} 次执行`);
        }, index * 1000);
    })(j);
}
http://www.dtcms.com/a/106348.html

相关文章:

  • Python设计模式:责任链模式
  • JAVASE(十三)常用类(二)包装类、工具类Arrays类
  • 【案例分享】江苏某汽车制造厂水冷式制冷站AI节能优化方案
  • LVS-----DR模式
  • JAVA中JVM一次 GC的 流程
  • 电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法
  • 分布式数据一致性场景与方案处理分析|得物技术
  • 谷粒商城:Redisson
  • TiDB 可观测性解读(二)丨算子执行信息性能诊断案例分享
  • Linux网络编程socket服务器端模拟实现
  • JSP 指令
  • Python数据类型-dict
  • 第八届 蓝桥杯 嵌入式 省赛
  • 【ESP32-IDF 笔记】02-LED PWM 配置
  • 运维面试题(ORACLE数据库)--20250401
  • Cesium学习(未完继续)
  • 题解:AT_arc050_c [ARC050C] LCM 111
  • Android的安全问题 - 在 Android 源码的 system/sepolicy 目录中,区分 public、private 和 vendor的目的
  • Kotlin 作用域函数:apply、let、run、with、also
  • 掩码图像建模 (MIM) 中的对数似然与交叉熵
  • 品铂科技与宇都通讯UWB技术核心区别对比(2025年)
  • C++:位图和布隆过滤器
  • spring-ai-alibaba第三章ollama集成Tool
  • 【redis】缓存 更新策略(定期、实时生存),缓存预热、穿透、雪崩、击穿详解
  • ERP管理系统:Java+Vue,含源码及文档,一体化管理资源,优化流程,强化企业运营效率
  • React.memo()和 useMemo()的用法是什么,有哪些区别
  • CSS3学习教程,从入门到精通,CSS3 媒体查询实现响应式布局语法指南(21)
  • Unity插件SuperScrollView详解(基础篇)
  • Redis安全与配置问题——AOF文件损坏问题及解决方案
  • 机器人--ros2--IMU