闭包函数是JavaScript很重要的一个概念,作为一个有过开发经验的前端工程师,绝对不可能没用过闭包。但是令人感到不幸的是,并不是每个人都能很好的表达闭包。如果你也是这样的情况,那么这篇博客很适合你
基础要想了解什么是闭包,首先得学一些基础知识
作用域链
一般情况下,变量取值到创建这个变量的函数的作用域中取值。
但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
JS 垃圾回收机制
JavaScript 引擎中有一个后台进程称为垃圾回收器,它监视所有对象,并删除那些 不可访问 的对象。
进阶知道什么是作用域链和JS的垃圾回收机制,我们就可以来学习闭包了。
什么是闭包
闭包函数就是可以访问到上级作用域内变量的内部函数。
接下来这两个问题面试官经常会问。
为什么闭包函数能够让局部变量的值始终保持在内存中?
因为JS的垃圾回收机制只会回收不可访问的对象。
而闭包函数只要还被引用,绑定在作用域链上的对象就会因为闭包的关系不会被当做垃圾回收。
这也就是闭包能够让局部变量的值始终保持在内存中的原因。
闭包函数什么时候释放内存
当闭包函数不被引用时,就会释放内存,即将该函数设为 null 时。
《JavaScript权威指南》里面有这样一段话。在js垃圾回收机制中,一旦某个变量不再被引用,那么这个变量将会被回收