闭包

当内部函数被保存到外部会形成闭包,造成原有的作用域链不释放导致内存泄漏

闭包的作用:

1.实现公有变量

举例:

function add(){
  var num=0;
  function a (){
    console.log(++num);
  }
  return a
}
  var demo =add();
  demo()//1
  demo()//2

 

2,做缓存(存储结构)

function test(){
  var food="苹果"
  var obj={
      eatfood:function(){
        if(food!=""){
          console.log("我要吃"+food)
          food=""
        }else{
          console.log("这里没有东西吃")
      }
    },
      pushfood:function(myfood){
        food=myfood
    }
  }
return obj
}
  var demo=test();
  demo.eatfood();
  demo.eatfood();
  demo.pushfood("橘子");
  demo.eatfood();

3,实现封装,属性私有化

function D(){
    var age=10
    this.name="zzz"
    this.add=function(){
        age+=1
        console.log(age)
    },
    this.jian=function(){
        age-=1
        console.log(age)
    }
}
var test=new D();    

 

4.模块化开发,防止全局变量污染

var name="abc"
var init=(function(){
    var name="zzz"
    function sayName(){
        console.log(name)
    }
    return function(){
        sayName();
    }
}())

 

闭包会导致多个执行函数共用一个共有变量,如果不是特殊需要,应该尽量防止这种事情发生

 

 

 

function test(){
  var arr=[];
  for(var i=0;i<10;i++){
    arr[i]=function(){
    console.log(i)
  }
}
  return arr
}
  var myarr=test();
  for(var j=0;i<10;j++){
  myarr[j]();
}

这样执行的结果打印出来的是10个10

要想打印1-9可用立即执行函数

function test(){
  var arr=[];
  for(var i=0;i<10;i++){
    (function(j){

      arr[j]=function(){
      console.log(j)
    }  

  }(i))
}
  return arr
}
  var myarr=test();
  for(var j=0;i<10;j++){
  myarr[j]();
}

 

 

小练习:给每个li绑定点击事件,并且输出下标值

<ul>
  <li>a</li>
  <li>a</li>
  <li>a</li>
  <li>a</li>
</ul>

var liColer=document.getElementsByTagName("li")
for(var i=0;i<liColer.length;i++){
  (function(j){
    liColer[j].onclick=function(){
    console.log(j)
   }
  }(i))
}

 

posted @ 2020-07-25 13:51  颿華正茂  阅读(119)  评论(0)    收藏  举报