重学前端:你给我翻译翻译,什么叫闭包! 什么TM的叫TM的闭包!

271 阅读1分钟

基础知识重新学习,若有不对欢迎指正,感恩。

闭包在面试中基本上属于月经题,那么闭包究竟是什么呢?

什么是闭包?

当函数可以记住并访问所在词法作用域时,就产生了闭包。即便这个函数时在当前函数作用域之外调用。

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)不需要时手动销毁
}