在闭包就是在函数里面声明函数,实际开发中主要应用于封装变量,保护变量不受外界污染,也相当于是在函数作用域里面再声明一个内部作用域,这样执行结果拿到的变量都是不同的,拿的就不是全局变量
函数和对其周围状态的引用捆绑在一起构成闭包,就是一个函数可以访问另一个函数里的变量,
闭包是一种现象,发生过程:某函数执行时,里面有函数被定义,并被返回
作为参数被传入 作为返回值被返回,总之被定义和执行的地方不一样
应用
隐藏数据
```javascript
function createCache() {
const data = {};
return {
set: function (key, val) {
data[key] = value;
},
get: function (key) {
return data[key];
},
};
}
```
闭包是怎么产生的
通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,在创建了一个闭包以后,这个函数的作用域就会一直保存到闭包不存在为止。
在 javascript 中,如果一个对象不再被引用,那么这个对象就会被垃圾回收机制回收;
如果两个对象互相引用,而不再被第 3 者所引用,那么这两个互相引用的对象也会被回收。
闭包只能取得包含函数中任何变量的最后一个值
闭包的应用
一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
可以读出函数内部的变量,正常情况下,外部函数是无法读取到内部函数的变量的,所以可以说:闭包就是将函数内部和函数外部连接起来的一座桥梁,即函数作为参数传递
由于对象内的变量一直被引用,所以这对象不会被垃圾回收机制回收。可以始终保持在内存中
闭包的注意点
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
① 减少全局变量;
② 减少传递函数的参数量;
③ 封装;
① 使用闭包会占有内存资源,过多的使用闭包会导致内存溢出等
面试官:正好你提到了内存泄漏,说说你的解决方法
应聘者:简单的说就是把那些不需要的变量,但是垃圾回收又收不走的的那些赋值为null,然后让垃圾回收走;