函数闭包

闭包的那些事儿

  • 怎么写一个闭包
    闭包是什么就不解释了,直接写一个闭包函数:

 

  var f = function() {
    var num = 0;
    return function() {
      return num += 1;
    };
  }

js中,函数是一等公民,定义一个函数f,它返回另一个可执行函数function() { return num += 1; };

js中的作用域,都是一层一层向上找的,在f内部函数里面,他的num向上找到父函数的作用域。
现在,我们执行一下:

 

f()()
// 1
f()()
// 1
????? 感觉 不太对?为什么num没有自增呢??
  • 内存回收机制
    为什么上面执行结果不太对,因为执行f()()后,f函数已经执行完毕了,没有其他资源引用f,ta会被立即释放,也就是说,f()()执行完后,立即就释放了。
    如何才不释放呢?

 

// 创建f的引用
var fn = f();
fn()
// 1
fn()
// 2
fn()
// 3

这下就对了,num成了私有变量,f拥有了私有作用域。

完了吗?
f有了fn的引用,内存一直得不到释放,咋办呢?这样的函数多了是不是会造成内存溢出?
手动释放一下:

 

var fn = f();
fn()
// 1
fn()
// 2
fn()
// 3
// 手动释放f的引用
fn = null
// f的引用fn被释放了,现在f的作用域也被释放了。num再次归零了。
var fn = f()
fn()
// 1



作者:zlx_2017
链接:https://www.jianshu.com/p/6cb5075c5731
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值