JavaScript闭包

Javascript闭包

什么是闭包?

简要概括:
一个函数拽着别人的东西不放并且拿来直接使用,举个例子:一个人死了它会啥也没有了,然后这时突然有一个人还拽着它的一个东西那么这个东西就不会没有,这就是闭包
规范概括:
Javascript中有一个叫做GC(垃圾回收器)的东西,他专门回收我们创建的变量然后从未使用过的,还有一些我们已经执行完的无用的函数或者变量,因为他只会把没有任何东西和它有关系的东西看作垃圾,闭包就是利用这一点形成的

闭包是怎么产生的?

function a(){
  var name = '输出这个说明出现了闭包';
  return function b(){
   	console.log(name);
  }
}
var b = a();
b();//输出:输出这个说明出现了闭包

讲解提要:
这里需要用到我前面两篇文章《作用域》《预编译》的知识点所以如果有这两个知识点不懂得小伙伴建议先去看一下我的这两篇文章( 如果有帮助得话记得点赞加收藏哦 )
讲解:
首先我们看到有一个函数嵌套,在作用域这个知识点里我们提到子孙是可以拿到父辈得变量或者函数的。有了这么一个知识点的铺垫那么接下来我们来看我们执行函数a时我们将函数b返回了出去并且用变量b接收了这个函数,记住b是a的子孙所以b可以拿到a的name那么我们将b返回到全局中去然后我们运行b,所以我们就得到了结果“输出这个说明出现了闭包”
这里可能会问上面我们不是说有GC垃圾回收器吗?回收垃圾呀,此时的a已经执行完了我们的name因为应该没有了才对,既然没有了为什么b还能访问到呢?
这里就要注意了GC垃圾回收器确实是回收垃圾变量和函数的,可是我们是怎么分辨它是不是垃圾的呢?“看还有没有东西可以访问到它”,就算还有一个他都不算垃圾因为我们的程序还需要它,那么我们此时的b就还能访问到它所以name不算是一个垃圾,所以就没有被GC给回收掉,于是我们就可以访问

使用闭包时应注意的事项

通常产生闭包的地方会出现return一个什么什么,不过闭包并不一定就是要return才会产生所以我们分辨闭包的最好方法还是:运用作用域和GC垃圾回收器机制来判断一个变量或者一个功能它是否产生了闭包

总结

  1. 想要玩转好闭包利用闭包的规则做一些逆天的骚操作,作用域和预编译的知识一定要吃透
  2. GC垃圾回收器会把没有任何指向的变量或函数当作垃圾,只要还有一个能访问到它的东西它这个变量或者函数都不会被当作垃圾进行回收
  3. 闭包并不一定是通过return关键字产生的,更多的是作用域和预编译以及GC的机制这些种种规则下产生的,所以如果我们想要准确的判断一个变量或者函数是否真的产生了闭包我们得从这三个地方出发去看,那么我们一定就真正的理解闭包了

结语:

很感谢大家能看到结尾,如果这篇文章有帮助到你们请用小手点个赞并且收藏以便日后查阅呗!谢谢大家!

Date:2020/6/8
By:落魄前端在线炒粉zzz

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页