闭包

高阶函数

当一个函数将函数作为参数或者返回值,则称该函数为高阶函数

闭包

Closure闭包,又称词法闭包和函数闭包

维基百科

闭包在是实现上是一个结构体,它存储了一个函数和一个关联的环境

MDN

闭包是一个函数和对其周围环境(词法环境)的引用捆绑在一起的组合


闭包跟函数最大的区别在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样即使脱离了捕捉时的上下文,它也能照常运行

自由变量:定义在外部作用域,而使用于内部作用域

闭包的内存泄露

ECMA规范——标记清除GC算法

由于闭包获取了函数内的函数对象,因此堆内存中会有该函数对象的函数存储空间AO

解决方法

将获取的函数对象的变量指向null,使其称为不可达对象,从而被GC清除

浏览器开发者调试工具——内存查看

性能 => 勾选内存 => 开始录制

V8引擎性能优化

构造闭包时,会自动释放未使用的自由变量

  1. function foo(){
  2. var name="rv";
  3. var age=20;
  4. function bar(){
  5. /*
  6. debugger;
  7. 使用debug可查看当前闭包的自由变量,会发现此时foo仅有name而没有age,原因是因为V8引擎解析到age未被使用,而自动释放
  8. */
  9. console.log(name)
  10. }
  11. return bar
  12. }
  13. var f=foo();
  14. f();