JavaScript闭包与IIFE深度解析:从记忆性到私有变量模拟

作者:青柠

时间:2026-10-24

浏览:335

本文深入解析JavaScript闭包的核心机制,阐述函数与其声明时环境状态组合形成的记忆性。通过代码示例演示如何利用闭包模拟私有变量及安全化数据操作。同时详细讲解IIFE(立即调用函数表达式)的定义、作用及其在解决循环变量捕获问题中的应用,帮助开发者理解作用域隔离与数据封装的最佳实践。

文章目录

1.什么是闭包?

闭包是指函数本身与其在声明时所处的词法环境状态(即变量环境)的组合体。

1.什么是闭包?

1.2 闭包的记忆性:函数能够记住定义时所处的环境

1.什么是闭包?

1.什么是闭包?

1.3 闭包现象:JS中每次创建函数时都会创建闭包

1.什么是闭包?

2.闭包的功能:记忆性、模拟私有变量

2.1 记忆性

1.什么是闭包?

举例:

1.什么是闭包?


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        function createCheckTemp(standardTemp){
            function checkTemp(n){
                if(n<=standardTemp){
                    alert('你的体温正常');
                }else{
                    alert('你的体温偏高');
                }
            }
            return checkTemp;
        }
        var checkTemp_A=createCheckTemp(37.1);
        var checkTemp_B=createCheckTemp(37.3);
        checkTemp_A(37.2);
        checkTemp_A(37.0);
        checkTemp_B(37.2);
        checkTemp_B(37.0);
    </script>
</body>
</html>

细节:

1:闭包的记忆性

2:函数return checkTemp,是一个函数名

3:定义var checkTemp_A和checkTemp_B来获取函数名checkTemp,而不是直接调用

2.2 模拟私有变量(安全化变量)

1.什么是闭包?

闭包代码举例:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 封装一个函数,这个函数的功能就是私有化变量
        function fun(){
            // 定义一个局部变量a
            var a=0;
            return {
                getA:function(){
                    return a;
                },
                add:function(){
                    a++;
                },
                pow:function(){
                    a*=2;
                }
            }
        }
        var obj=fun();
        // 如果想在fun函数外面使用变量a,唯一的方法就是调动getA()方法
        console.log(obj.getA());
        // 想让变量a进行+1操作
        obj.add();
        obj.add();
        obj.add();
        console.log(obj.getA());
        obj.pow();
        console.log(obj.getA());
    </script>
</body>
</html>

1.什么是闭包?

从语言特性来看,JavaScript不像C++或Java那样支持通过返回类型(如int sum())来定义函数签名,因此需要借助闭包的特性:利用函数内部对变量的记忆性来操作内部数据,并通过返回闭包函数的引用来实现对外部数据的受控访问。

3.IIFE(Immediately Invoked Function Expression,立即调用函数表达式):

这是一种特殊的JavaScript函数形式,其核心特征是定义完成后立即执行。

1.什么是闭包?

3.1 IIFE作用1-为变量赋值

举例:

通过对比前后代码结构,可以体现编程水平的提升:使用IIFE能够简化代码逻辑,提升代码的美观度与可读性。

1.什么是闭包?

1.什么是闭包?

3.2 IIFE作用2-将全局变量变为局部变量

1.什么是闭包?

在此场景下,若不使用IIFE,下方五个语句的输出结果均为5。这是因为在ES5及之前的JavaScript中不存在块级作用域的概念(暂按此理解),导致var声明的变量i成为全局变量,for循环结束后i的值固定为5,因此所有回调函数的结果都是5。

接下来可以利用IIFE来解决这一问题,其本质正是利用了函数的闭包特性。

1.什么是闭包?

将全局变量i作为参数传入IIFE函数中,使得原本的全局变量在函数内部变为局部变量。再利用JavaScript函数的闭包特性,即可实现图中arr[2]()等函数的预期功能,确保每次迭代捕获正确的变量值。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注本站的更多内容!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章