闭包
高阶函数
当一个函数将函数作为参数或者返回值,则称该函数为高阶函数
闭包
Closure闭包,又称词法闭包和函数闭包维基百科
闭包在是实现上是一个结构体,它存储了一个函数和一个关联的环境
MDN
闭包是一个函数和对其周围环境(词法环境)的引用捆绑在一起的组合
闭包跟函数最大的区别在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样即使脱离了捕捉时的上下文,它也能照常运行
自由变量:定义在外部作用域,而使用于内部作用域
闭包的内存泄露
ECMA规范——标记清除GC算法
由于闭包获取了函数内的函数对象,因此堆内存中会有该函数对象的函数存储空间和AO
解决方法
将获取的函数对象的变量指向null,使其称为不可达对象,从而被GC清除
浏览器开发者调试工具——内存查看
性能 => 勾选内存 => 开始录制
V8引擎性能优化
构造闭包时,会自动释放未使用的自由变量
function foo(){var name="rv";var age=20;function bar(){/*debugger;使用debug可查看当前闭包的自由变量,会发现此时foo仅有name而没有age,原因是因为V8引擎解析到age未被使用,而自动释放*/console.log(name)}return bar}var f=foo();f();
