<JavaScript>闭包

目录

1.什么是闭包?

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

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

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

2.1 记忆性

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

3.IIFE(Immediately Invoked Function Expression,立即调用函数表达式):JS特殊函数,一旦被定义,就立即被调用

3.1 IIFE作用1-为变量赋值

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


1.什么是闭包?

函数本身该函数声明时所处的环境状态的组合。

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

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

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 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_A来获取函数名checkTemp,而不是直接调用

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

闭包代码举例:

<!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>

其实可以理解,JavaScript不像C++、Java那样能定义函数的类型,比如int sum()、int add()、int pow()等等,所以就需要利用闭包的特性:即在函数内闭包的记忆性来对函数内变量进行操作,然后返回闭包函数的名称来进行内部数据操作。

3.IIFE(Immediately Invoked Function Expression,立即调用函数表达式):JS特殊函数,一旦被定义,就立即被调用

3.1 IIFE作用1-为变量赋值

举例:

前后两图对比一下,体现编程水平。。。简化代码。。美观。。。

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

这种情况下,下面五个语句的结果都是5,因为在JS中是没有块作用域这个概念的(暂时这么理解),所以var i就成了全局变量,for循环后i=5。所以五个语句的结果都是5。

那么加下来可以利用IIFE解决这个问题,其本质是利用了函数的闭包特性

全局变量i传入IIFE函数中,全局变量 就 变成了局部变量,再利用JS函数的闭包特性,即可以实现图中arr[2]()的功能。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 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> <div> <img src='images/1.jpg' height='150px' width='150px'> <img src='images/2.jpg' height='150px' width='150px'> <img src='images/3.jpg' height='150px' width='150px'> <img src='images/4.jpg' height='150px' width='150px'><br/> <button id="like-btn1">赞(<span id="like-count1">0</span>)</button> <button id="like-btn2">赞(<span id="like-count2">0</span>)</button> <button id="like-btn3">赞(<span id="like-count3">0</span>)</button> <button id="like-btn4">赞(<span id="like-count4">0</span>)</button> </div> <script type="text/javascript"> // 闭包方式实现点赞功能1 var like = (function() { var count = 0; return function() { count++; document.getElementById("like-count1").innerHTML = count; } })(); // 监听点击事件并调用闭包函数1 document.getElementById("like-btn1").addEventListener("click", like); // 闭包方式实现点赞功能2 var like = (function() { var count = 0; return function() { count++; document.getElementById("like-count2").innerHTML = count; } })(); // 监听点击事件并调用闭包函数2 document.getElementById("like-btn2").addEventListener("click", like); // 闭包方式实现点赞功能3 var like = (function() { var count = 0; return function() { count++; document.getElementById("like-count3").innerHTML = count; } })(); // 监听点击事件并调用闭包函数3 document.getElementById("like-btn3").addEventListener("click", like); // 闭包方式实现点赞功能4 var like = (function() { var count = 0; return function() { count++; document.getElementById("like-count4").innerHTML = count; } })(); // 监听点击事件并调用闭包函数2 document.getElementById("like-btn4").addEventListener("click", like); </script> </body> </html>改正代码
06-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值