闭包

闭包

理解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填充

原文地址:https://www.cnblogs.com/3542446186qq/p/10139155.html