• JavaScript闭包(closure)


    前言

        看到closure后,一开始感觉很高大上,更多的是想去了解它的应用场合。

    内容

    定义部分

        指有权访问另一个函数作用域中的变量的函数,创建闭包的方法就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。


    特点

        1、函数结构体为嵌套函数;

        2、函数内部可以引用外部的参数和变量;

        3、参数和变量不会被GC回收;

        4、常驻内存,增大内存使用量,使用不当很容易造成内存泄露;


    普通闭包

     

    <script>
    function test(){
    	var a=1;
    	//匿名函数
    	return function(){
    		alert(a++);
    	};
    };
    
    var fun=test();//JavaScript变量和函数转换,
    
    fun();// this result is 1;
    fun();// this result is 2;
    
    //由于闭包会使变量始终保存在内存中,如果不当使用会增大内存消耗,手动释放内存;
    fun = null;//变量a被GC回收
    
    </script><span style="color:#0D0D0D;background:white"></span>


    注意:将写好的闭包函数返回值赋值为另一个变量,方便调用,如果直接调用闭包函数,有时候会调用不成功(自己亲测)。

        从上面的例子可以看出,由于闭包中的参数和变量不会被垃圾回收机制回收,变量值为最后一次运行变量值。相当于变量a只被初始化了一次,有点静态变量循环取值有点类似,如下:

    <span style="font-family:KaiTi_GB2312;font-size:18px;">//变量被关键字static修饰
    for (int i=0;i<10;i++)
    {
    	static int a=1;
    	a++
    	console.write(a);
    }</span>

        输出结果为:0,1,2,3,4,5,6,7,8,9

        此处有静态变量关键字static修饰变量的时候,只初始化一次。

    • 平时我们在写JavaScript函数的时候,当变量a为全局变量进行累加时:
    <span style="font-family:KaiTi_GB2312;font-size:18px;">//实现全局变量累加
    <script>
    var a=1;
    function test(){
    	a++;
    	alert(a);
    }
    
    test();//this result is 2
    test();//this result is 3
    test();//this result is 4
    </script></span>
    • 当a为局部变量时:
    <span style="font-family:KaiTi_GB2312;font-size:18px;">//当a变为局部变量
    <script>
    function test(){
    	var a=1;
    	a++;
    	alert(a);
    }
    
    test();//this result is 2
    test();//this result is 2
    </script></span>
    • 利用闭包实现局部变量累加:
    <span style="font-family:KaiTi_GB2312;font-size:18px;"><script>
    function test(){
    	var x=10;
    	//匿名函数
    	return function(){
    		x++;
    		alert(x);
    	}
    }
    
    test();//this result is 11
    test();//this result is 12
    </script></span>
    • 私有成员存在的闭包:
    <span style="font-family:KaiTi_GB2312;font-size:18px;">//私有成员的存在
    <script>
    var test=(function(){
    	var a=1;
    	function bbb(){
    		a++;
    		alert(a);
    	}	function ccc(){
    		a++;
    		alert(a);
    	}	return{
    		b:bbb,		//返回结果为JSON(键值对)结构
    		c:ccc
    	}
    })();
    
    test.b();//this result is 2
    test.c();//this result is 3
    </script></span>

    小结

    上面那样使用的好处:

        1、采用匿名函数,防止造成全局变量污染;

        2、利用闭包,实现了一个变量长期驻扎在内存中;

        3、私有成员的存在


    感谢您的宝贵时间······

  • 相关阅读:
    Vue.nextTick()的介绍和使用场景
    JS实现数据双向绑定
    JS对象的可枚举属性和不可枚举属性
    JS中对象转数组方法总结
    Vmware虚拟机安装XP系统
    javascript和c#的深度拷贝的一种通用方法
    c# SQLServer导入大批量数据
    PowerDesigner逆向工程,从SQL Server数据库生成Physical Model -----数据源方式
    虚拟机和主机ping不通,SQL Server无法远程连接的解决方法
    c#生成试卷。。。
  • 原文地址:https://www.cnblogs.com/zhoulitong/p/6412349.html
Copyright © 2020-2023  润新知