闭包

闭包

  • example
var btns=document.getElementsByTagName("input")
for(var i=0;i<btns.length;i++){
    btns[i].click=function(){
        alert(i)
    }
}
OUTPUT:这个时候会出现点击每个btn都是alert(4),因为for循环已经执行完了
解决方案:
1.给btn[i].index=i   赋值属性
2.  
    function init(){
        var btns=document.getElementsByTagName("input")
        for(var i=0;i<btns.length;i++){
            (function(i){
                btn[i].onclick=function(){
                    alert("我是第"+(i+1)+"按钮")
                }
            })(i)
        }
    }

如何产生闭包

  • 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包,并不需要调用子函数就产生了闭包,也就是外部函数被调用,内部函数被创建的时候

闭包到底是什么

  • 理解一:闭包是嵌套的内部函数
  • 理解二:包含被引用变量的对象
  • 注意:闭包存在于嵌套的内部函数中

产生闭包的条件

  • 函数嵌套
  • 内部函数引用了外部函数的数据

常见的闭包

1.将函数作为另一个函数的返回值

function fun1(){
    var a=0;
    function fun2(){
        a++;
        console.log(a)
    }
    return fun2;
}
var f1=fun1()
f1()
f1()
OUTPUT:1   2
产生了一个闭包
产生新的闭包:
var f2=fun2()
f2()
f2()

2.将函数作为实参传递给另一个函数调用

  • 使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
  • 让函数外部可以操作(读写)到函数内部的数据

问题
1.函数执行完后,函数内部声明的局部变量是否存在?

  • 存在,但是在p=fun()的p里面,换了指向
    2.在函数外部能直接访问函数内部的局部变量吗?
  • 不可以
function fun1(){
    var a=0;
    var b=0;
    var fun2=function(){
        a++;
        console.log(a)
    }   -------------这个等到赋值的时候闭包才产生


    function fun3(){---------这个在母函数调用的时候就产生了
        a--;
        console.log(a)
    }
}

闭包的声生命周期

  • 在嵌套的内部函数成为垃圾对象时,或者赋值为null

闭包的缺点

当window对象还存在时,闭包会占用内存

function fun1(){
    var a =new Array(10000);
    function fun2(){
        console.log(a)
    }
    return fun2
}
var f=fun2
手动释放
f=null
  • example
var name="this.window"
var obj={
    name:"this obj",
    getName:function(){
        return function(){
            return this.name;
        }
    }
}
OUTPUT:this.window
  • example
var name="this window"
var obj={
    name:"this obj",
    getName:function(){
        var this_=this
        return function(){
            console.log(this.name)
            console.log(this_.name)
        }
    }
}
OUTPUT:这里的可以使之指向OBJ
posted @ 2021-02-23 15:18  abcdefgab  阅读(69)  评论(0)    收藏  举报