闭包

闭包

概念

函数的返回值 为 被定义的函数,外部函数中 套 另一个函数,

优点:保证变量不会被全局污染,外部可以访问函数内部的变量

缺点:执行完毕后变量不会释放,容易造成内容溢出

原理: 因为作用域 以及函数赋值的特点

函数赋值特点

将一个定义的函数赋值给另一个变量XX,xx() 实际上执行的就是这个作用域以及父级作用域的值,如果为局部变量,

全局变量不会污染布局变量

function add(){
    var x = 0;
    console.log(x) //验证普通函数,变量释放
    return function(){
        console.log(++x) //验证闭包中函数,变量不释放
    }
}
add() //0
add() //0
add() //0
add() //0

var rem = add();
rem() //1
rem() //2
rem() //3
rem( ) //4

使用闭包的注意点

  1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
  2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

闭包实例

下面这个是关于闭包的实例,请看
在这里插入图片描述
解释实例

function fun(n,o){
    console.log(o);
    return{
        fun: function(m){
            return fun(m , n);
        }
    };
}


var a = fun(0);
// //undefined  返回 a 对象 {fun:function(m){return fun(m,0)}}
a.fun(1);
//  run(1,0)   0  {fun: function(1){...}} 返回对象
a.fun(2);
//  由对象 fun(2,0)  0  {fun:function(2){...}}
 a.fun(3);
//  0

var b = fun(0)  
//undefined  返回一个 b 对象 {fun:function(m){return fun(m,0)}};
.fun(1)
// 由 b 对象 转为 function(1){return fun(1,0)}  --> fun(1,0) -->
//      0   再返回一个对象 {fun:function(m){return fun(m,1)}}
.fun(2)
// //  function(2){return fun(2,1)} --> 1  {fun:function(m){return fun(m,1)}}
// .fun(3);    //
// //  function(3){return fun(3,1)} --> 1  {fun:function(m){return fun(m,3)}}


//  function(2){return fun(2,1)} --> 1  {fun:function(m){return fun(m,2)}}
.fun(3);    //
//  function(3){return fun(3,2)} --> 2  {fun:function(m){return fun(m,3)}}

var c = fun(0).fun(1);
// undefined   返回一个 对象 {fun:function(m){return fun(m,0)}}
// 再运行 .fun(1)  -->
// function(1){return fun(1,0)} --> 0 --> 
// 再返回一个对象,也就是 c  {fun:function(m) {return fun(m,1)}}
c.fun(2);
// 通过 c 对象,执行方法
// 执行 fun(2)
//---> function(2){return fun(2,1)} --> 1 --> 
c.fun(3);
//1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值