答:闭包说的通俗一点就是可以在函数外部访问到函数内部的变量。因为正常情况下函数外部是访问不到函数内部作用域变量的,作用域分为了全局.函数级.块级作用域.
表象判断是不是闭包:函数嵌套函数,内部函数被return 内部函数调用外层函数的局部变量
优点:可以隔离作用域,不造成全局污染
缺点:由于闭包长期驻留内存,则长期这样会导致内存泄露
如何解决内存泄露:将暴露外部的闭包变量置为null
适用场景:我在性能优化的过程中,使用节流防抖函数就是闭包的原理,导航栏获取下标的使用项目后期的时候进行了一定的性能优化.比方说:对级联菜单的功能,使用了节流防抖的方式,减少了http请求,
或者一个注册模块的时候,要实时(oninput)去后台验证用户名是否已注册给出相应的提示.
闭包的应用的时候,处理能够进行导航栏菜单获取当前下标.
巧妙的转嫁到节流防抖函数上.如果忘了节流防抖函数可以
提一下lodash函数库.(自愿)
Tips:说道闭包可能就会问道垃圾回收机制
通俗的说法就是js是一个弱类型语言.不用的就会被js引擎的垃圾回收机制(GC)自动回收掉,据我了解是用了一种标记回收的方式吧,就是从根节点上把能访问到的都做上标记.定期检测.没有标记的就被清除掉.释放掉内存.因为闭包的一直被引用着就一直有标记就回收不了了.可以置为null就可以,当然垃圾回收机制的打标记.js引擎也做了一定的优化.来提升性能.大体上我就了解这些[再有兴趣的可以参考https://segmentfault.com/a/1190000018605776]
垃圾回收机制有没有了解
js引擎在进行垃圾标识的时候,为了提高性能,有一些处理方式,
我记得好像能分代清除(哪些不常活跃,就不检查)
另一个叫空闲时间回收 增量回收,我的理解就是分开,类似异步的检测来理解,是否放开