• 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 这个是闭包
    --------------------------------------------------------------------------------------------------------
     
     
  • 相关阅读:
    leetcode Simplify Path
    leetcode Evaluate Reverse Polish Notation
    leetcode Swap Nodes in Pairs
    leetcode MinStack
    leetcode length of the last word
    empty能否代替isset?
    thinkphp框架的路径
    PHP 反射类的简单使用!
    在windows下配置redis扩展
    phpmyadmin的windows下和linux下的安装。
  • 原文地址:https://www.cnblogs.com/qianxunpu/p/7714490.html
Copyright © 2020-2023  润新知