JS 闭包(Closure)

2018-09-17  本文已影响109人  Klart

参考阮一峰老师的JS 闭包

理解闭包前需要理解变量作用域、变量提升

JS作用域

先来看一下一道题目
<ul>
  <li>选项1</li>
  <li>选项2</li>
  <li>选项3</li>
  <li>选项4</li>
  <li>选项5</li>
  <li>选项6</li>
</ul>
/变量提升了,var item;var i;/

var item =document.querySelectorAll('li')

for (var i=0;i<item.length;i++){
  items[i].onclick=function(){
  console.log(i);
}
}

点击li依次打印出来什么?
答案:每次打印都是6
原因:变量提升了;i是全局变量;

那如何让它依次打印,12345呢;

因为i是全局变量,所以首先需要把i变为局部变量;
for (var i=0;i<item.length;i++){
  var temp=function(j){
   items[j].onclick=function(){
    console.log(j);
}
}
temp(i)
}
这样打印的话就是依次打印123456

现在来说说闭包:

  function f1(){

    var n=999;

    function f2(){
      alert(n); 
    }

    return f2;

  }

  var result=f1();

  result(); // 999
这样就是一个闭包;
闭包的作用就是暴露局部变量;

芳芳理解闭包
闭包

上一篇下一篇

猜你喜欢

热点阅读