zoukankan      html  css  js  c++  java
  • 闭包

    闭包

    理解js中的闭包,首先理解JavaScript中的作用域以及作用域链的问题

    当一个函数嵌套另外一个函数,外部函数将嵌套函数对象作为返回值返回的时候,把这种情况成为闭包

    eg:

      function fun1(){

              var  a=100;    //声明局部变量 a

       function fun2(){    //嵌套函数,在作用域里

        console.log(a)

      }

      return fun2  //调用嵌套函数fun2,并将fun2的执行结果返回

    }

    var fun=fun1();

    fun()  //输出结果:100

    fun()  //输出结果:100

    函数fun()声明了一个局部变量,并定义了一个函数fun2,最后将函数的执行结果返回,输出值1

    eg:

      function fun1(){

              var  a=100;    //声明局部变量 a

       function fun2(){    //嵌套函数,在作用域里

        a++;

        console.log(a);

      }

      return fun2  //调用嵌套函数fun2,并将fun2的执行结果返回

    }

    var fn1=fun1();

    var fn2=fun1();

    fn1()  //输出结果:101

    fn1()  //输出结果:102

    fn2()  //输出结果:101

    fn2()  //输出结果:102

    现在函数fn1仅仅返回函数内嵌套的一个函数对象,而不是直接返回结果,在定义函数作用域的外面调用函数,由于这个函数作用域链式在函数定义的时候就以及创建的,嵌套的函数在定义在这个作用域链里,并且变量a又是局部变量,不管在何时何地执行函数,这种绑定依然有效。因此,局部变量会一直保存下来。

    闭包实现

    当一个函数创建后,它保存了一个作用域链,并且作用域链会被函数中的作用域可访问的对象num填充

  • 相关阅读:
    【数学】三分法
    【数学】【背包】【NOIP2018】P5020 货币系统
    【数学】【CF27E】 Number With The Given Amount Of Divisors
    【单调队列】【P3957】 跳房子
    【极值问题】【CF33C】 Wonderful Randomized Sum
    【DP】【CF31E】 TV Game
    【神仙题】【CF28D】 Don't fear, DravDe is kind
    【线段树】【CF19D】 Points
    【字符串】KMP字符串匹配
    【二维树状数组】【CF10D】 LCIS
  • 原文地址:https://www.cnblogs.com/3542446186qq/p/10139155.html
Copyright © 2011-2022 走看看