JavaScript闭包详解

 更新时间:2021年10月25日 15:43:43   作者:老闫在努力  
一分钟理解JavaScript闭包,关于JavaScript闭包的内容介绍了很多,本文带着大家快速理解什么是JavaScript闭包,感兴趣的小伙伴们可以参考一下

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]()的功能。

总结

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

相关文章

  • JavaScript中的值是按值传递还是按引用传递问题探讨

    JavaScript中的值是按值传递还是按引用传递问题探讨

    这篇文章主要介绍了JavaScript中的值是按值传递还是按引用传递问题探讨,本文讲解了按值传递、按引用传递、按共享传递、基本类型的不可变(immutable)性质等内容,需要的朋友可以参考下
    2015-01-01
  • 使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置

    使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置

    Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。下面这篇文章主要给大家介绍了关于使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置的相关资料,需要的朋友可以参考下
    2018-11-11
  • js实现图片放大并跟随鼠标移动特效

    js实现图片放大并跟随鼠标移动特效

    这篇文章主要为大家详细介绍了js实现图片放大并跟随鼠标移动特效,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 关于textarea的直观换行的一些研究材料

    关于textarea的直观换行的一些研究材料

    关于textarea的直观换行的一些研究材料...
    2006-10-10
  • JavaScript下载后端返回的文件流的三种方法

    JavaScript下载后端返回的文件流的三种方法

    本文主要介绍了JavaScript下载后端返回的文件流的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • JS遍历DOM文档树的方法实例详解

    JS遍历DOM文档树的方法实例详解

    这篇文章主要介绍了JS遍历DOM文档树的方法,结合实例形式分析了javascript遍历dom文档树的相关方法与使用技巧,需要的朋友可以参考下
    2018-04-04
  • 如何手动实现es5中的bind方法详解

    如何手动实现es5中的bind方法详解

    这篇文章主要给大家介绍了关于如何手动实现es5中的bind方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面小编来一起学习学习吧
    2018-12-12
  • javascript canvas封装动态时钟

    javascript canvas封装动态时钟

    这篇文章主要为大家详细介绍了javascript canvas封装动态时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • 跟我学习javascript的严格模式

    跟我学习javascript的严格模式

    跟我学习javascript的严格模式,对javascript严格模式进行概述,进入严格模式的方法,以及如何调用和相关语法,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • 全面解析JavaScript中apply和call以及bind(推荐)

    全面解析JavaScript中apply和call以及bind(推荐)

    在javascript中apply、call和bind是三兄弟,很好的搭档,下面小编给大家全面解析JavaScript中apply和call以及bind的相关知识,感兴趣的朋友一起学习吧
    2016-06-06

最新评论