什么是闭包,闭包的作用。

什么是闭包?

有二个函数,相互嵌套。内层函数引用了外层函数的变量。这就是闭包

        function fn(){
        	var num=1
        	function fn2(){
        		console.log(num)
        	}
        }

闭包形成的条件?

1. 内部函数使用了外函数的变量(还包括外部函数的参数)

      function fn(){
        	var num=1
        	function fn2(){
        		console.log(num)      //这个num引用了外部的num
        	}
        }


2. 外部函数返回了内部函数。

      function fn(){
        	var num=1
        	function fn2(){
        		console.log(num)      
        	}
                return fn2   //把函数fn2通过return返回出去
        }


              上面就是外层函数return返回内部函数

下面是更深入的补充:
-----------------------------------------------------------------------------------------
这里详细说明一下为什么要用return,我可不可以直接fn2()直接调用吗?
    

    return 返回出去的是这个fn2函数本身。因为函数是引用类型,引用的是函数的地址。每次的值都会被保存。


例如:我把fn2用return返回出去------这里是一个每次调用都会自加的计数器案例

                  function fn(){

        	        var num=0

        	        function fn2() {

                        num++

                        console.log(num)
        		    
        	        }

        	            return fn2
        	            
                    }

                var f=fn()          这里我们调用fn()函数,执行函数fn()函数体内的代码,
                                    返回的结果是function fn2(){}这个函数体,这个时候函数
                                    内部还没有被调用。我们在用f()进行调用。然后fn2内部的
                                    num就会引用了外层的num。



                f()         //每次调用都会加1



如果return返回的是函数本身,函数是引用类型的。每次引用的都是地址。那么每次都会在原有的基础上去想加。如果把return fn2换成 fn2()直接调用。那么每次调用完内部函数就会销毁。每次的结果都是0.
为什么我们把return返回出去就不会被释放销毁了呢?我们把return返回出去。然后用f去接收。这样f就会指向fn2这个函数。内存就不会被销毁释放。而在函数内部调用函数。内存调用完会被立即销毁释放掉。


3. 在函数外,有变量引用函数内

var f = fn();   //此处调用函数fn,执行的结果就是函数fn2
f();            //此处调用的是fn2这个函数,执行以后指向外层函数的变量

闭包的作用:

访问函数内部变量、保持函数环境中一直存在,不会被垃圾回收机制处理

闭包的优点:保护函数内变量的安全不会被修改。在内存中维持一个变量,可以做缓存。

闭包的缺点:因为使用闭包,可以使函数在执行完后不被销毁,保留在内存中,如果大量使用闭包就会造成内存泄露,内存消耗很大

注意点:频繁的使用闭包会造成内存泄露。记得在退出函数之前,将不使用的局部变量赋值为null;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值