什么是闭包

1.什么是闭包

闭包:内部函数可以访问到其所在外部函数中声明的参数和变量,即使再外部函数在终结之后

全局作用域中是访问不到局部作用域里面的变量的,js提供的解决办法就是在函数里面在定义一个函数,也就是闭包

闭包函数:声明在一个函数中的函数,叫做闭包函数

2.闭包的优缺点

优点:有利于封装,可以访问到局部变量;不会污染全局变量

缺点:内存占用浪费;内存泄漏

内存泄漏:不再用到的内存,没有及时释放

闭包就是找到同一地址中父级函数中对应变量的值

下面看例子

function fn(){
    var a=1;
    function add(){
        console.log(++a); //2
    }
    return add;
}
var c=fn();
c();
fn()函数执行后,把fn返回的局部函数赋值给全局变量,由于全局变量在代码执行过程中是不会被销毁的,
所以它用到的值即局部函数没有被销毁,而局部函数中使用的变量也就保存下来了

 

function fn1(){
    var i=0;
    function add(){
        i++;
        console.log(i);
    }
    return add;
}
var b=fn1();  //每次外部函数执行时,都会产生一个引用地址,也就是产生一个新的作用域;所以这里的b和c是两个不同的地址,里面的变量i也是不同的;指向这句话闭包就是找到同一地址中父级函数中对应变量的值
var c=fn1();  
b(); //1
c(); //1
b(); //2
c(); //2
b第一次执行时,i=1;变量i被保存下来了,所以第二次执行i时,i=2; c同理;对比下面的案例
function fn1(){
    var i=0;
    function add(){
        i++;
        console.log(i);
    }
    return add;
}
fn1()(); //1
fn1()(); //1
fn1()(); //1  每次函数执行时,产生了新的地址
var i = 0;
function fn2(){
  function add(){
       i++;
       console.log(i);
  }
  return innnerFn;
}
var b= fn2();
var c= fn2();
b(); //1
c(); //2
b(); //3
c(); //4
这里i是全局变量,i一直保存在内存中;
闭包在js事件中的用法,外部的匿名函数创建新的作用域,内部的函数保持对外部匿名函数作用域的引用,得到i的值
var
li=document.getElementsByTagName("li"); for(var i=0,len=li.length;i<len;i++){ (function(i){ li[i].onclick=function(){ alert(i); } })(i) } //如同下面的写法 var li=document.getElementsByTagName("li"); for(var i=0,len=li.length;i<len;i++){ clicks(i,li); } function clicks(i,lib){ lib[i].onclick=function(){ alert(i); } }

 

        var fn=(function fn2(){
            var a=1;
            function add(){
                console.log(++a);
            }
            return add;
        })();
        fn(); //2
        function fn2(){
            var a=3;
            var fn3=function(){
                console.log(a);
            }
            a++;
            return fn3;
        }
        var b=fn2();
        b(); //4,打印出来的a为4,fn2执行之后,a变成4,再执行函数fn3

 

对象中使用闭包
function person(name){ function
get(){ console.log(name); } this._get=function(){ return get; } } var p=new person('xm'); var pp=p._get(); pp(); //xm

 

posted @ 2020-02-15 23:28  程序员瑶琴  阅读(1831)  评论(0编辑  收藏  举报