服务器之家:专注于服务器技术及软件下载分享
分类导航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服务器之家 - 编程语言 - JavaScript - js教程 - 关于Javascript闭包与应用的详解

关于Javascript闭包与应用的详解

2022-03-07 16:02Marshal_dj js教程

这篇文章主要介绍了关于Javascript闭包与应用的详解,文中有非常详细的代码示例.对正在学习js的伙伴们有很好的帮助,需要的朋友可以参考下

前言

Javascript闭包在学习过程中一般较难理解,本文从什么是闭包,常见闭包示例,闭包作用,闭包应用及闭包问题等方面来介绍闭包,希望能给大家带来更深层次的认识,有不恰当之处请指出,谢谢。

一、什么是闭包?

闭包是指一个嵌套的内部(子)函数引用了父函数作用域中数据的函数,这就产生了闭包。

关键理解:

1. 产生闭包必须要有嵌套函数
2. 闭包是函数,并是嵌套的内部函数
3. 闭包内部函数必须要引用父函数作用域中数据

如果不满足以上条件,则不能产生闭包,接下来示例说明。

1.1闭包满足条件代码

?
1
2
3
4
5
6
7
8
9
<script>
            function person(){
                var name='marshal';
                function student(){ //声明子函数
                    console.log(name);//引用父函数作用域的变量name
                }
            }
            person();//函数执行,产生闭包
        </script>     

关于Javascript闭包与应用的详解

1.2闭包产生时机

?
1
2
3
4
5
6
7
8
9
10
<script>
        function person(){
            var name='marshal';//js执行此行时,产生闭包
            function student(){ //声明子函数
                console.log(name);//引用父函数作用域的变量name
            }
            student();//内部函数在外部函数调用
        }
        person();//函数执行,虽满足闭包条件,但未产生闭包
    </script>

关于Javascript闭包与应用的详解

闭包产生时机:嵌套子函数代码块有引用父函数作用域的数据,并该嵌套子函数要执行前,创建上下文时产生闭包。或者简单说该该嵌套子函数在外部被执行时,此刻产生了闭包。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
            function person(){
                var name='marshal';
                function student(){
                    console.log(name);  //该方法代码内为闭包代码
                }
                return student;
            }
            var p=person();//因创建子函数对像,此时产生第一次闭包,并将子函数student返回给p,由于p没有消失,子函数引用的变量name,一直在内存在存储,直到将p=null,进行回收
            p();//执行子函数的闭包代码块,输出"marhsal"
            p();//第二次执行子函数的闭包代码块,输出"marhsal"
            person();//第二次创建子函数调对象,此时产生第二次闭包,但不执行子函数student代码块     
        </script>

二、常见闭包示例

2.1 子函数做为实参传递

?
1
2
3
4
5
6
7
8
<script>
            function setTimeoutTest(message,time){
                setTimeout(function(){
                    alert(message);//嵌套子函数引用父函数变量message,产生闭包
                },time);
            
            setTimeoutTest('提示信息',1000);
        </script>

2.2 计数器使用(函数返回)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
                function count(){
                    var i=1;
                    function add(){
                        i++;
                        console.log(i);
                    }
                    return add;
                }
                var c=count();//生产闭包
                c();//2
                c();//3
                c();//4
        </script>

三、闭包作用

3.1 闭包作用

1)子函数引用父函数的变量或函数,生命周期延长

2)其变量或函数一直存在,外部可以访问函数内部的值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
            function count(){
                var i=1;
                function add(){
                    i++;
                    console.log(i);
                }
                return add;
            }
            var c=count();
            c();//2
            c();//3  i的生命周期延长
    </script>

四、闭包应用

4.1 自定义封装js代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
外部js代码  out.js  实现自加与自减
(function count(){
    var i=1;
    function add(){
        i++;
        console.log(i);
    }
    function subtract(){
        i--
        console.log(i);
    }
    window.count={
        add:add,
        subtract:subtract
    }
})();
?
1
2
3
4
5
6
7
引用 out.js代码
<script src=out.js></script>
        <script>
            count.add(); //2
            count.subtract();//1
            count.subtract();//0
        </script>

五、闭包问题

5.1 闭包与this

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
     var name="marshal"; //创建全局变量
     var person={
         name:"leo",
         getName:function(){ //返回匿名函数
             return function(){  //返回this.name
                return this.name;  //返回字符串
             }
         }
     };
     alert(person.getName()()); //输出marshal,内部函数不可能直接访问外部函数this
     
</script>

解决方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
         var name="marshal";
             var person={
                 name:"leo",
                 getName:function(){
                     var that=this;//把this保存到闭包可以访问的另一个变量中
                     return function(){
                        return that.name;
                     }
                 }
             };
             alert(person.getName()());//that 指向person,而不是window
    </script>

5.2 内存泄露

在使用闭包时,因变量一直存在,需要解除对象的引用,将对象设置为null, 从而确保其内存在适当时候可以被回收。

到此这篇关于关于Javascript闭包与应用的详解的文章就介绍到这了,更多相关js闭包与应用内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Marshaljun/article/details/115785867

延伸 · 阅读

精彩推荐
  • js教程three.js显示中文字体与tween应用详析

    three.js显示中文字体与tween应用详析

    这篇文章主要给大家介绍了关于three.js显示中文字体与tween应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习...

    郭志强10012021-12-24
  • js教程JS获取一个字符串中指定字符串第n次出现的位置

    JS获取一个字符串中指定字符串第n次出现的位置

    这篇文章主要介绍了JS获取一个字符串中指定字符串第n次出现的位置,文章内容实例讲解的很清晰,有需要的同学可以研究下...

    小king哥5162022-01-20
  • js教程JS实现简单抖动效果

    JS实现简单抖动效果

    这篇文章给大家结束了通过js实现抖动效果,非常不错,具有参考借鉴价值,感兴趣的朋友参考下吧...

    catEatBird9332022-01-12
  • js教程JavaScript中常用的几种字符串方法汇总(新手必看)

    JavaScript中常用的几种字符串方法汇总(新手必看)

    这篇文章主要给大家介绍了关于JavaScript中常用的几种字符串方法的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价...

    Humor_Mr9132022-02-25
  • js教程原生js 实现表单验证功能

    原生js 实现表单验证功能

    这篇文章主要介绍了原生js如何实现表单验证功能,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下...

    蒋伟平7372022-01-19
  • js教程你不知道的 JS 沙箱隔离

    你不知道的 JS 沙箱隔离

    本文接下来的内容,将介绍我在探索基于 Web Worker 实现 JavaScript 沙箱隔离方案过程中的一些资料收集、理解以及我的踩坑和思考的过程。...

    前端大全10372021-12-29
  • js教程js闭包和垃圾回收机制示例详解

    js闭包和垃圾回收机制示例详解

    这篇文章主要给大家介绍了关于js闭包和垃圾回收机制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    丶Serendipity丶8172022-01-24
  • js教程JS 的 六种打断点的方式,你用过几种?

    JS 的 六种打断点的方式,你用过几种?

    Debugger 是前端开发很重要的一个工具,它可以在我们关心的代码处断住,通过单步运行来理清逻辑。而 Debugger 用的好坏与断点打得好坏有直接的关系。...

    神光的编程秘籍7962021-12-16