闭包的定义与用法规则

闭包

定义

拥有作用域的代码块,js代码在script作用域中,所以代码块一般都是闭包。但闭包的解释我们一般用于函数中。

函数闭包

闭包格式

 function fx() {
        var a = 1;
        function fn() {
          console.log(a);
        }
        return fn;
      }
      var fg = fx();
特点

1.函数嵌套函数

function fx(){
            function fn(){}
            return fn
        }
var fg=fx()

2.内层函数可以访问外层函数的参数和变量

 function fx(){
            var a= 1
        function fn(){
                console.log(a);
            }
         return fn
        }
  var fg = fx()
fg()//1

这里的fn没有自己的局部变量,所以会优先访问外层函数的变量,所以fn可以使用父函数fx声明的变量a。

作用

1.防止变量和参数被垃圾回收机制回收(变量持久化)

 function fx() {
        var a = 1;
        function fn() {
          console.log(a);
        }
        fn();
        return fn;
      }
      var fg = fx();//fg的值就相当于fx return的函数即fn
      fg();//1 fg()相当于fn()
      fg();//1 同上,fx中的变量a没有被销毁

2.防止全局污染(变量只在闭包内部可访问)

(1)当没有进行闭包时

var a=1
      function fx() {
        a++
        console.log(a);
      }
      fx()//2
      fx()//3
      fx()//4

如果还有其他函数用到了a值,则会受到污染,而且全局变量容易被修改不安全。

(2)进行了闭包

function fx() {
          var a=1
        function fn() {
            a++
            console.log(a);
        }
        return fn
      }
    var fg = fx()
    fg()//2
    fg()//3
    fg()//4

这样变量a在函数内部不易被修改和污染。

缺点

1.变量不会被垃圾回收机制回收,造成内存的消耗

 function fx() {
        var a = 1;
        function fn() {
          console.log(a);
        }
        fn();
        return fn;
      }
      var fg = fx();//fg的值就相当于fx return的函数即fn
      fg();//1 fg()相当于fn()
      fg();//1 同上,fx中的变量a没有被销毁

这里的变量a一直储存在fx中。

2.不恰当的使用闭包可能造成内存泄漏

 闭包外面的变量不会被销毁,因为函数会一直被调用,当闭包过多内存就会销毁。

解决方案:1.不使用闭包

                   2.可将内存函数对象的变量赋值为null

 function fx() {
        var a = 1;
        function fn() {
          console.log(a);
        }
        fn();
        return fn;
      }
      var fg = fx();
      fg();//1 
      fg();//1 
      a=null
      fg();

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神明也犯困

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值