什么是闭包
有权访问其他函数属性或者方法的函数,就是闭包
闭包生成的原理
- 由于子函数执行时候,执行上下文维护着一个作用域链在最顶部,而该作用域链不仅保存当前作用域的方法和属性,还保存了父函数作用域链的引用值。
- 所以导致父函数被销毁后,该引用值还保存在子函数的作用域链中导致无法销毁
举个栗子
function parent(){
var data = 1;
return function child(){
console.log(data)
}
}
var egg = parent()
egg()
- 首先执行代码时会把全局上下文压到上下文执行栈中
- 然后把parent的函数上下文压到上下文执行栈中
- 弹出parent上下文执行,由于parent没有被引用会被销毁
- 把child函数上下文压入上下文执行栈中
- 打印data
- 弹出child上下文
parent函数已经被销毁,为什么child函数能访问data
- 所有函数会在执行时保存作用域链到[[scope]]里面
- 所以子作用域会[当前执行上下文].concat([父函数的作用域链])
- 所以子函数里面访问变量是通过访问[[scope]]访问到上级作用域里面的data
问题
- 综上由于闭包会保存父函数的引用值,座椅闭包过大会引起内存泄漏
- 可以反推,父函数也是保存全局变量的引用值,所以全局变量过大也会引起泄露