前端面试必问之闭包
什么是闭包?
闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
为什么有闭包的存在?闭包的作用?
局部变量无法共享和长久的保存,而全局变量可能造成变量污染,造成数据的不安全
所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染保证数据的安全
闭包的缺点?
占用更多内存,不容易被释放
内部函数占用了外部函数的局部变量,同时内部函数被返回出来:导致内部函数不能被释放,进而导致占用了外部函数的局部变量:导致外部函数无法释放内存
代码说明
function outer() {
let o = '外部函数的局部变量';
let inner = function () {
console.log(o);
}
return inner;
}
let res = outer();
res();
变量的存储说明: 基本变量的值一般都是存在栈内存中,如Number 、Boolean、Undefined、String、Null
而函数类型的变量则保存到堆中
生命周期说明:函数中定义产生的局部变量。局部变量的生命周期在函数执行之后就结束了,此时就将其引用向内存释放。
当程序执行完let res = outer(),其实outer的执行环境并没有被销毁,因为他里面的变量o仍然被被inner的函数作用域链所引用,所以res();函数执行会打印o变量的值
闭包占用内存的问题如何解决?
将外部用完内部函数后的变量(res)不再指向内部函数:自动释放
res = null;
不是所有的场景都可以被释放的(有些场景必须占用)
ES6出现之后:可以使用const来保证的数据的安全(不被污染),闭包没有太多的价值