一看就会的闭包

425 阅读2分钟

关于闭包的理解

  • 什么是闭包
    • 是密闭的容器,用来存储数据,类似于像set、map这样的容器。
    • 是一个对象,是用来存储键值对的,存放数据的格式为key:value
  • 闭包形成的条件
    • 函数嵌套
    • 内部函数引用外部函数的局部变量
  • 闭包的优点
    • 延长外部函数的局部变量的生命周期
  • 闭包的缺点
    • 容易造成内存泄漏
  • 使用闭包时的注意点
    • 合理使用闭包
    • 用完闭包要及时销毁

闭包案例1

function fun(){
    var count = 1;
    return function(){
        count++;
        console.log(count);
    }
}

var fun2 = fun();
fun2();------------>2
fun2();------------>3

闭包案例2

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

var a = fun(0)----------->undefined
a.fun(1)----------------->0
a.fun(2)----------------->0
a.fun(3)----------------->0

//上面程序可以这么看,在当前作用域内找变量的值

//var a = fun(0)
function fun(n,o){
    var n=0,o=undefined;
    console.log(o)-------->undefined
    return {
        fun:function(m){
            var m;
            return fun(m,n)
        }
    }
}

//a.fun(1)
function fun(n,o){
    var n=0,o=0;
    console.log(o)-------->0
    return {
        fun:function(m){
            var m=1,n=0;
            return fun(m,n)
        }
    }
}

//a.fun(2),a.fun(3)
function fun(n,o){
    var n=0,o=0;
    console.log(o)-------->0
    return {
        fun:function(m){
            var m=2||3,n=0;
            return fun(m,n)
        }
    }
}

闭包案例三

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

var b = fun(0).fun(1).fun(2).fun(3);
//上面程序可以这么看,在当前作用域内找变量的

//var b = fun(0).fun(1).fun(2).fun(3);
//var b = fun(0)
function fun(n,o){
    var n=0,o=undefined;
    console.log(o)-------->undefined
    return {
        fun:function(m){
            var m;
            return fun(m,n)
        }
    }
}

//var b = fun(0).fun(1)
function fun(n,o){
    var n=0,o=0;
    console.log(o)-------->0
    return {
        fun:function(m){
            var m=1,n=0;
            return fun(m,n)
        }
    }
}

//var b = fun(0).fun(1).fun(2)
//说明前面fun(0).fun(1)整体是一个对象,最后传入的参数是1
function fun(n,o){
    var n=1,o=1;
    console.log(o)-------->1
    return {
        fun:function(m){
            var m=2,n=1;
            return fun(m,n)
        }
    }
}


//var b = fun(0).fun(1).fun(2).fun(3)
//说明前面fun(0).fun(1).fun(2)整体是一个对象,最后传入的参数是2
function fun(n,o){
    var n=2,o=1;
    console.log(o)-------->2
    return {
        fun:function(m){
            var m=3,n=2;
            return fun(m,n)
        }
    }
}

闭包案例四

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

var c =fun(0).fun(1);---->undefined/0
c.fun(2);---------------->1
c.fun(3);---------------->1
//c.fun(2);使用的是同一个对象c里的闭包
//fun(0).fun(1)的结果
function fun(n,o){
    var n=1,o=0
    console.log(o)-------->undefined/0
    return {
        fun:function(m){
            var m=1,n=0
            return fun(m,n)
        }
    }
}

//c.fun(2)和c.fun(3)都调用上面一个结果;
function fun(n,o){
    var n=2,o=1
    console.log(o)-------->1
    return {
        fun:function(m){
            var m=2,n=1
            return fun(m,n)
        }
    }
}