现在面试闭包是基本上必问的,你还在回答这样回答吗:一个大函数套一个小函数,小函数可以访问大函数的变量这就是闭包。这样就太low了,可能因为这一道题目你就gg了,与公司无缘了。让我们来康康当问到闭包应该怎么回答吧。
1. 闭包是什么?
答:函数执行会形成一个私有上下文,如果当前私有上下文的某些内容被除私有上下文以外的事物所占有,那么当前私有上下文就不能出栈释放,那么它里面的私有变量也就被保存下来了,同时在代码执行过程,私有变量和外界互不干扰。
2.闭包有什么作用
答:闭包的作用:保护/保存。
闭包它是函数运行时候所产生的机制,函数执行会形成一个全新的私有上下文,可以保护里面的私有变量和外界互不干扰(保护机制),但是大家所认为的闭包,需要当前上下文不能被出栈释放,这样私有变量及它的值也不会被释放掉(保存机制);
3.闭包好不好
答:不好!大量应用闭包肯定会导致占有大量内存,但是闭包的作用保护和保存,是我们真实项目中所需要的,所以需要“合理使用闭包”
4.js中的内存优化
【栈内存(执行上下文)】
*一般情况下,函数执行完,所形成的上下文会被出栈释放掉
*特殊情况:当前上下文中某些内容被上下文以外的事物占用了,此时不能出栈释放
*全局上下文:加载页面创建的,也只是有页面关闭才会被释放掉
【堆内存】
浏览器的垃圾回收机制:
1. 引用计数(以IE为主):「被占有一次计数累加1,当取消运用在减去1,当减到零的时候,会把其释放掉」
2. 引用检测 标记清除(以谷歌为主):「被占用后做一个标记,当移除引用,取消标记,在浏览器空闲的时候,会把所有未被标记的内存回收」
手动释放内存,其实就是解除占用(手动赋值为null即可)