目录:
  • 闭包概念
  • 理解闭包
  • 闭包作用

闭包:

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。闭包就是间接访问变量或者隐藏变量。

区分作用域是理解闭包的重中之重

 function fun() {
   let a = 10;
   console.log(a);//10
 }
 fun();
 console.log(a)//a is not defined

现在我们在函数外部拿不到变量a怎么办?但是我就想得到它。

function fun() {
   let a = 10;
   function foo() {
     console.log(a)//10
   }
   foo();
 }
 fun();

经过验证,foo可以拿到fun内的变量。也就是说由于作用域,foo内会进行RHS查询,拿到上层作用域中的变量。

再把foo函数当作返回值就可以在fun外部访问它的函数变量了。那这就是闭包了。
一个作用域使用了另一个作用域的变量,就产生了闭包。

闭包作用:

  • 访问函数局部变量。
  • 让变量保存在内存中。
  • 声明私有变量。

第一个作用在上方实例中已经提过,我们来看为啥能让变量保存在内存中。

function fun() {
   let a = 10;
   return () => {
     return a++;
   }
 }
 let foo = fun();
 console.log(foo());//10
 console.log(foo());//11
 console.log(foo());//12

不难看出,在执行完第一次后并没有立即回收,而是保存在了内存中。

这是因为匿名函数在全局作用域,而匿名函数的存在必须有fun函数,因此fun始终在内存中。

更多内容请看:IFTS