• js闭包


    2017-03-23

    文章来源:http://www.cnblogs.com/daysme

    变量分为全局变量和局部变量。
    他们之前是用函数隔开的。
    除了函数,其他都没有作用域之说。
    
    全局变量:可重用。易被污染。
    局部变量:不会被污染,不能重用。
    闭包:既能重用变量,又能保护变量不被污染。
      在函数内声明一个函数,并把这个函数返回出来。
      闭包就是能读取其他函数内局部变量的函数。因为只有函数内部的子函数才能读取局部变量,
      因为可以把闭包理解为定义在一个函数内部的函数。
    
    闭包的作用:
      一个是可以读取函数内部的局部变量。
      一个是让这些变量始终保存在内存中。
    
    全局变量
    var n=1;
    function fn(){
      console.log(n);
    }
    fn();
    
    局部变量
    function fn(){
      var n=1;
    }
    fn();
    console.log(n); //获取不到变量,并报错
    
    返回变量-最初的闭包思想
    function fn(){
      var n=1;
      return 1;
    }
    var a=fn();
    console.log(a);
    
    闭包,其实就是一种函数。
    function fn(){
      var n=1;
      return function(){
        console.log(n)
      };
    }
    var a=fn();
    a();
    
    例子:
    function fn(){
      var n=1;
      add=function(){
        n++;
      }
      function fn1(){
        console.log(n); //获取变量
      }
      return fn1; //返回出来
    }
    var result=fn(); //保存到全局变量中
    result();
    add();
    result();
    
    此时 fn 中的局部就是一直保存在内存中,并没有在fn被调用后销毁。
    为什么没有被销毁?因为 fn1() 被返回出来并且由全局变量接收保存了,
    全局变量result是不会被销毁的,但result的值是fn1,fn1的值引用着 fn() 中的 n ,所以 fn 也不会被删除。
    
    闭包三个步:
      1.外层函数包裹着受保护的变量和操作变量的内层函数。
      2.外层函数把内层函数返回到函数外。
      3.使用者调用外层函数,获得内层函数。
      此时被返回出来的函数就叫闭包。
    
    闭包形成的原因:
      外层函数的作为域对象无法释放。
    
    例,没用到上层函数的任何东西。
    var name='the window';
    var objcet={
      name:'my objcet',
      getname:function(){
        return function(){
          return this.name;
        }
      }
    }
    console.log(objcet.getname()());
    
    例, 指向obj的this 已经保存在内存中。
    var name='the window';
    var objcet={
      name:'my objcet',
      getname:function(){
        var that=this;
        return function(){
          return that.name;
        }
      }
    }
    console.log(objcet.getname()());
  • 相关阅读:
    剑指 Offer 22. 链表中倒数第k个节点
    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
    Leetcode1450. 在既定时间做作业的学生人数
    Leetcode1572. 矩阵对角线元素的和
    Leetcode 1480. 一维数组的动态和
    Idea连接数据库报错
    Java实现二叉树层次遍历并存入List的方法:从上往下,从左往右
    SpringCloud资源网站
    Java循环对list进行remove
    Java中字符串判空的正确打开方式
  • 原文地址:https://www.cnblogs.com/daysme/p/6606962.html
Copyright © 2020-2023  润新知