为了账号安全,请及时绑定邮箱和手机立即绑定

javascript闭包

javascript闭包

慕斯709654 2018-10-15 17:18:30
这个i是为什么一直在内存中 麻烦各位前辈指导一下
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

首先一个变量能够一直停留在内存中的条件是什么?
能够被外部引用,而且是一直引用
这种引用不限于直接引用,还包括间接引用以及循环引用
接下来你需要了解一定的JS内存结构的知识了
先分析函数

var a = (function() {

  var i = 0;

  function fn() {

    alert(i++);

  }

  return {

    fa: function() {

      fn();

    }

  }

}());

a.fa();// 0

a.fa();// 1

其实这个闭包有好多化蛇添足的地方,这个后面再说

  • 第一:这是一个立即执行/自调用的函数(function(){}())并将该函数的返回值赋值给全局变量a

  • 第二:看看这个函数执行之后做了什么

    • 创建内部变量i(对外不可见);

    • 创建内部变量fn(对外不可见);

    • 创建对象{fa: function(){fn()}} === {fa: fn}并作为返回值返回给全局变量a;

  • 第三:执行阶段

    • 调用a.fa函数,本质上调用了fn函数,也就是外部持有fn函数的一个副本,内部变量fn没有随着函数的执行结束消亡,常驻内存

    • fn函数的执行会alert(i++)其实,即使不对i进行任何操作,fn依然持有内部变量i的一个副本,内部变量i没有随着函数的执行结束消亡,常驻内存

  • 结论: 这里是比较典型的间接引用i,fn的例子通过未命名的返回对象

  • 扩展:

var a = (function() {

  var i = 0;

  function fn() {

    alert(i++);

  }

  return fn;

}());

a();// 0

a();// 1

这个直接引用了fn间接引用了i

查看完整回答
反对 回复 2018-11-24
  • 1 回答
  • 0 关注
  • 558 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号