闭包相关整理

闭包是什么?

闭包就是一个把函数内部和外部连接起来的桥梁

简单说就是访问函数作用域中的变量的函数

闭包怎么做到的?

函数内部定义的变量是局部的 当局部变量所在的函数被调用的时候  开始执行

调用执行一旦结束 局部变量就会被释放

闭包延长局部变量的执行时间 当函数执行完毕以后 局部变量不可以被内存释放 然后让外部可以访问到这个变量

闭包的特点是什么?

1.函数套函数,闭包一定有嵌套函数

2.外层函数一定有局部变量,且内层函数一定操作了外层函数的这个变量

3.内层函数会使用return返回外部(如果不返回这个内层函数,你就没办法使用这个闭包,返回内层函数的最终的目的就是让外部可以访问到这个闭包)

闭包的示例

比如一个函数 他有局部作用域  我们应该如何拿到里面的值?

function init() {

      var name = '123';

      function displayName() {

        return name

      }

      return displayName()

    }

    var a = init()

    console.log(a);

 这只是个闭包的简单例子

闭包还可以封装存储私有变量

 // 封装私有变量

    var person = function () {

      //变量作用域为函数内部,外部无法访问

      var name = "default";

      return {

        getName: function () {

          return name;

        },

        setName: function (newName) {

          name = newName;

        }

      }

    }();

    console.log(person);

    console.log(person.name);;//直接访问,结果为undefined

    console.log(person.getName()); // default);

    person.setName("abruzzi");

    console.log(person.getName()); // abruzzi

闭包的作用还有保留之前的词法环境 不让变量被释放

function makeAdder(x) {

      return function (y) {

        return x + y

      }

    }

    var add5 = makeAdder(5)

    var add10 = makeAdder(10)

    console.log(add5(2)); // 7

并且闭包都是引用自己词法作用域的内的变量

在一个闭包内对变量的修改 不会影响到另外一个闭包中的变量

var makeCounter = function () {

      var privateCounter = 0;

      function changeBy(val) {

        privateCounter += val;

      }

      return {

        increment: function () {

          changeBy(1);

        },

        decrement: function () {

          changeBy(-1);

        },

        value: function () {

          return privateCounter;

        },

      };

    };

    var Counter1 = makeCounter();

    var Counter2 = makeCounter();

    console.log(Counter1.value()); /* logs 0 */

    Counter1.increment();

    Counter1.increment();

    console.log(Counter1.value()); /* logs 2 */

    Counter1.decrement();

    console.log(Counter1.value()); /* logs 1 */

    console.log(Counter2.value()); /* logs 0 */

闭包实例  体会存储词法环境

 

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>Document</title>

</head>

<style>

  body {

    font-family: Helvetica, Arial, sans-serif;

    font-size: 12px;

  }

  h1 {

    font-size: 1.5em;

  }

  h2 {

    font-size: 1.2em;

  }

</style>

<body>

  <a href="#" id="size-12">12</a>

  <a href="#" id="size-14">14</a>

  <a href="#" id="size-16">16</a>

  <script>

    function makeSizer(size) {

      return function () {

        document.body.style.fontSize = size + "px";

      };

    }

    var size12 = makeSizer(12);

    var size14 = makeSizer(14);

    var size16 = makeSizer(16);

    document.getElementById("size-12").onclick = size12;

    document.getElementById("size-14").onclick = size14;

    document.getElementById("size-16").onclick = size16;

    // 说实话 感觉闭包多余  不如使用下面的代码实现

    // document.getElementById("size-12").onclick = makeSizer(12);

    // document.getElementById("size-14").onclick = makeSizer(14);

    // document.getElementById("size-16").onclick = makeSizer(16);

  </script>

</body>

</html>

整理的闭包相关知识若能帮到大家微末 我将不胜荣幸 

若有相关指正 请不吝赐教

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值