js的闭包

形如下面就是闭包,在通常情况下在makeFn()执行完毕时 msg会被释放,我们不能通过执行内部的匿名函数来访问到它,而这压样执行fn() (return的匿名函数) 却能访问到msg,是因为外部作用域对msg有引用

function makeFn(){
  let msg='hello'
  return function (){
    console.log(msg);
  }
}
let fn = makeFn() // fn是 被return的匿名函数
makeFn()()//形同fn()

闭包本质,函数在执行的时候会放到执行栈上当函数执行完毕之后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员
闭包好处:为延长了外部函数内部变量的作用范围
个人理解:例如,makeFn函数在执行的时候,字符串(非长)存在栈中,栈中的数据在函数执行完毕是会被销毁的。但是因为msg为被捕获变量(如下),在js中被捕获变量存在堆中,所以我们还是能访问到。因此我们在外部作用域的fn()中还可以访问到makeFn()中的变量。

被捕获变量
被捕获变量就是局部变量的反面:在函数中声明,但在函数返回后仍有未执行作用域(函数或是类)使用到该变量,那么该变量就是被捕获变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值