• JS闭包


    function f1(){
        n=999;
        
       function f2(){
        
          alert(n);
        }  
       return f2; 
    }
    
    //为啥直接f1()访问不到
    var result = f1();
    result();
    
    f2函数就是闭包。简单来理解,闭包就是能够读取其他函数内部变量的函数。
    在js中,只有函数内部的子函数才能读取局部变量,因此闭包可以理解为,定义在一个函数内部的函数
    闭包的用途
    1,可以读取函数内部的变量
    2,就是让这些变量的值始终保持在内存中。
    function outerFun()
    {
     var a=0;
     function innerFun()
     {
      a++;
      alert(a);
     }
     return innerFun;  //注意这里
    }
    var obj=outerFun();
    obj();  //结果为1
    obj();  //结果为2
    var obj2=outerFun();
    obj2();  //结果为1
    obj2();  //结果为2
    //var obj=outerFun()后,变量obj实际上是指向了函数innerFun,再执行c()后就会弹出一个窗口显示i的值;
    //当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
    当内部函数 在定义它的作用域 的外部 被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们.
     
    闭包的作用:
    闭包的作用就是在outerFun执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回outerFun所占用的资源,因为outerFun的内部函数innerFun的执行需要依赖outerFun中的变量。
     
    也就说遇到需要存储动态变化的数据或将被回收的数据时,我们可以通过外面再包裹一层函数形成闭包来解决。
    function a(){
      var n = 0;
      function inc() {
        n++;
        console.log(n);
      }
      inc();
      inc();
    }
    a(); //控制台输出1,再输出2
     
    function a(){
      var n = 0;
      this.inc = function () {
        n++;
        console.log(n);
      };
    }
    var c = new a();
    c.inc();  //控制台输出1
    c.inc();  //控制台输出2
     
    ------------------------------------------------------------------------------
    function foo(x) {
    var tmp = 3;
    function bar(y) {
    alert(x + y + (++tmp));
    }
    bar(10);
    }
    foo(2) ;
    foo(2) ; 不管执行多少次都会alert--16 ,因为bar能访问foo的参数x,也能访问foo的变量tmp。
      但,这还不是闭包。因为bar()一直在自己的作用域被引用。当你return的是内部function时,就是一个闭包。
    ------------------------------------------------------------------------------------------------
    function a(){
    var n = 4;
    function b(y){
    alert(y+(++n));
    }
    return b;
    }
    c=a();
    c(10); ----15
    c(10); ----16 这个是闭包
    --------------------------------------------------------------------------------------------------------
     
     
  • 相关阅读:
    DC中为什么要用Uniquify?
    hdu 1596 find the safest road
    hdu2112 HDU Today
    hdu 2066 一个人的旅行
    poj 3026 Borg Maze
    poj 1979 Red and Black
    poj 1321 棋盘问题
    hdu 1010 Tempter of the Bone
    hdu 4861 Couple doubi
    codeforces584B Kolya and Tanya
  • 原文地址:https://www.cnblogs.com/qianxunpu/p/7714490.html
Copyright © 2020-2023  润新知