js基础 闭包

什么是闭包

有权访问其他函数属性或者方法的函数,就是闭包

闭包生成的原理

  1. 由于子函数执行时候,执行上下文维护着一个作用域链在最顶部,而该作用域链不仅保存当前作用域的方法和属性,还保存了父函数作用域链的引用值。
  2. 所以导致父函数被销毁后,该引用值还保存在子函数的作用域链中导致无法销毁

举个栗子

function parent(){
    var data = 1;
	return function child(){
		console.log(data)
}
}
var egg = parent()
egg()
  1. 首先执行代码时会把全局上下文压到上下文执行栈中
  2. 然后把parent的函数上下文压到上下文执行栈中
  3. 弹出parent上下文执行,由于parent没有被引用会被销毁
  4. 把child函数上下文压入上下文执行栈中
  5. 打印data
  6. 弹出child上下文

parent函数已经被销毁,为什么child函数能访问data

  1. 所有函数会在执行时保存作用域链到[[scope]]里面
  2. 所以子作用域会[当前执行上下文].concat([父函数的作用域链])
  3. 所以子函数里面访问变量是通过访问[[scope]]访问到上级作用域里面的data

问题

  1. 综上由于闭包会保存父函数的引用值,座椅闭包过大会引起内存泄漏
  2. 可以反推,父函数也是保存全局变量的引用值,所以全局变量过大也会引起泄露

参考:
javascript深入理解-从作用域链理解闭包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值