js高级-闭包

function foo(x){

  var tmp = 3;

  return function(y){  //把一个函数作为返回值,定义时候的作用域

    console.log(x+y+(++tmp))  //++tmp先自加再参与表达式运算

  }

}

var bar = foo(2)    //此时bar指向了匿名函数,匿名函数又指向了 x,tmp两个变量 bar就是一个闭包(匿名函数加x,tmp两个父级变量)

bar(10)  //16

bar(20)  //27 此时函数执行完成后里面的变量没有回收掉 所以tmp还是4 然后++tmp就是5 x还是2 y就是20 (只要bar没有释放里面的变量就不会回收 。关闭浏览器才会释放)

 

function d(){

  var a = 10;

  console.log(a)

}

d();  //执行完成后 a会被回收 浏览器关闭函数会被回收  函数+引用的变量就会形成闭包

 

闭包的应用

匿名函数自执行

var t = function (a){  //污染全局 尽量不要定义全局变量

  console.log(a)

}

t(9);

//尽量少的定义全局变量 例如 jQuery 只定义了 $,jQuery两个

;(function(a){

  console.log(a)

})(3)

1、循环注册dom事件

<ul>

  <li></li>

  <li></li>

</ul>

var lis = document.querySelectorAll('li')

for(var i=0; i<lis.length; i++){

  //典型错误

  lis[i].onclick = function(){  //事件的方法执行是:当事件触发的时候执行 绑定事件只有点击才执行。 是异步的 当事件触发的时候 i的值为lengh长度了 

    console.log(i)      //变量i是父函数里面的变量

  }

  //正确

  

  (lis[i].onclick = function(a){  //做成自执行函数来注册事件

    console.log(a)  

  })(i)

}

 

for(var i = 0; i< 10; i++){  //典型错误

  setTimeOut(function(){

    console.log(i)

  },1000)

}

 

for(var i = 0; i< 10; i++){  //匿名自执行函数解决

  (function(a){

    setTimeout(function(){

      console.log(a)

    },1000)

  })(i)

}

 

posted @ 2018-05-29 11:30  suanmei  阅读(92)  评论(0编辑  收藏  举报