维基百科定义闭包

  • 闭包,又称词法闭包或者函数闭包(有点官方,不好理解- - )
  • 支持头等函数的语言中,实现绑定的一种技术(这里的头等函数值可以作为别的函数的参数、函数的返回值,赋值给变量或存储在数据结构中。)
  • 闭包和函数最大的区别在于,当捕捉闭包的时候,他的自由变量在捕捉是会被确定,这样即使脱离的上下文,也可以正常执行
function foo() {
  // AO: 销毁
  var name = "foo"
  function bar() {
    console.log("bar", name)
  }

  return bar
}

var fn = foo()
fn()

这段代码中, name为自由变量,在fu函数执行的时候他可以在里面被bar函数所捕捉正常使用。

总结下闭包,
如果他可以访问外层作用域的自由变量,就可以称为闭包

内存泄漏

在堆空间内如果有两个指针相互指着对方那么并且后续不会使用这个函数对象的时候,那么就会内存泄漏,占用内存空间

function foo() {
  var name = "foo"
  var age = 18
}

function test() {
  console.log("test")
}

foo()
test()

image.png
这段在代码 内存中的过程就是这样parentScope代表作用域 执行fn函数 然后到GO对象中查找fn的函数对象,这里代码是打印name和age,bar函数中没有name和age就会像父级作用域中查找(foo函数),找到后打印出来,这里因为foo内有bar函数,bar函数的需要foo的name和age 所以他们指针相互指着,当他们互相指着的时候,如果fn函数还在继续使用,那么他们会一直存在不在移除,造成内存泄漏,所以对象无法释放。
解决方法就是,在使用完fn函数后给他添加 fu=null即可。
如有不对的地方,欢迎留言内补充。

Q.E.D.