前端资源&前端学习资料JavaScript相关文章

js中闭包的作用以及应用

2018-09-17  本文已影响239人  东邪_黄药师

对闭包的认识:

函数模式的闭包:在一个函数中有一个函数:

  function f1() {
    var num=10;
    //函数的声明
    function f2() {
      console.log(num); //输出10
    }
    //函数调用
    f2();
  }
  f1();

对象模式的闭包:函数中有一个对象:

  function f3() {
    var num=10;
    var obj={
      age:num
    };
    console.log(obj.age);//输出10
  }
  f3();

==============================================================

   function f1() {
    var num=10;
    return function () {
      console.log(num);  //输出10
      return num;
    }
  }

 var ff= f1();
 var result= ff();
  console.log(result);  //输出10


  function f2() {
    var num=100;
    return {
      age:num
    }
  }

  var obj= f2();
  console.log(obj.age); //输出100;

=======================================================
普通函数与函数模式闭包对比:

//普通的函数:
function f1() {
  var num = 10;
  num++;
  return num;
}
console.log(f1());//输出11;
console.log(f1());//输出11;
console.log(f1());//输出11;

//函数模式的闭包
       function f2() {
  var num = 10;
  return function () {
    num++;
    return num;
  }
}
var ff = f2();
console.log(ff());//输出11;
console.log(ff());//输出12,
console.log(ff());//输出113,

===========================================================
案例:产生多个相同的随机数:

 function showRandom() {
  var num=parseInt(Math.random()*10+1);
  console.log(num);
}

showRandom();
showRandom();
showRandom();

//闭包的方式,产生三个随机数,但是都是相同的

function f1() {
  var num=parseInt(Math.random()*10+1);
  return function () {
    console.log(num);
  }
}

var ff=f1();

ff();
ff();
ff();

//总结:如果想要缓存数据,就把这个数据放在外层的函数和里层的函数的中间位置
//闭包的作用:缓存数据.优点也是缺陷,没有及时的释放
//局部变量是在函数中,函数使用结束后,局部变量就会被自动的释放
//闭包后,里面的局部变量的使用作用域链就会被延长
==============================================================
闭包写点赞案例:
html:

  <ul>
     <li><img src="images/ly.jpg" alt=""><br/><input type="button" 
           value="赞(1)"></li>
      <li><img src="images/lyml.jpg" alt=""><br/><input type="button" 
            value="赞(1)"></li>
          <li><img src="images/fj.jpg" alt=""><br/><input type="button" 
              value="赞(1)"></li>
            <li><img src="images/bd.jpg" alt=""><br/><input type="button" 
           value="赞(1)"></li>
                 </ul>

js:
/获取所有的按钮
//根据标签名字获取元素

 function my$(tagName) {
return document.getElementsByTagName(tagName);

}
//闭包缓存数据
function getValue() {
var value=2;
return function () {
//每一次点击的时候,都应该改变当前点击按钮的value值
this.value="赞("+(value++)+")";
}
}
//获取所有的按钮
var btnObjs=my$("input");
//循环遍历每个按钮,注册点击事件
for(var i=0;i<btnObjs.length;i++){
//注册事件
btnObjs[i].onclick=getValue();
}

上一篇下一篇

猜你喜欢

热点阅读