基础知识重新学习,若有不对欢迎指正,感恩。
闭包在面试中基本上属于月经题,那么闭包究竟是什么呢?
什么是闭包?
当函数可以记住并访问所在词法作用域时,就产生了闭包。即便这个函数时在当前函数作用域之外调用。
function foo(){
let a = 1;
function bar(){
console.log(a)
}
return bar
}
let baz = foo()
baz() //1 闭包
复制代码
通常在foo()执行后,foo内部的作用域会被销毁(js的垃圾回收机制),而闭包阻止了销毁,foo内部的作用域依旧存在,因为bar()然在引用foo()的作用域。这个引用就称为闭包。
##闭包的作用
主要的功能就是实现模块暴露
function Foo(){
let something = 'cool'
function doSomething(){
return something
}
function doAnother(){
...
}
return {
doSomething:doSomething,
doAnother:doAnother
}
}
let foo = Foo() //创建模块实例
foo.doAnother() //调用执行暴露出来的方法
foo.doSomething() //调用执行暴露出来的方法
例如我现在我写了一个foo模块,不想别人私自访问我的内部变量,通过暴露方法来访问内部变量。
闭包的缺点
因为闭包阻止了销毁作用域,会造成内存泄漏。当函数没在引用后需要手动销毁。
function test() {
var data = new Array(100000);
var getData = function(){return data;};
let a = setInterval(getData, 100); //clearInterval(a)不需要时手动销毁
}