码迷,mamicode.com
首页 > 其他好文 > 详细

什么是闭包

时间:2020-02-16 00:59:03      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:doc   console   代码执行   lib   js事件   全局变量   strong   事件   写法   

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

 

什么是闭包

标签:doc   console   代码执行   lib   js事件   全局变量   strong   事件   写法   

原文地址:https://www.cnblogs.com/lita07/p/12314989.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!