JS高级—03—闭包
mdn讲的闭包也挺好的;
闭包可以帮助我们创建私有属性和私有方法;私有方法不仅仅有利于限制对代码的访问应该通过同意接口访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分;
但是闭包如果定义在构造函数的构造器上也会造成内存泄漏,应该定义子啊原型上;
通过makeadder小案列,来发现,通过一些传入一些参数,来定制一个函数;
一、闭包
闭包,就是一个函数被器被其所在的词法环境所包裹起来;形成了一个新的包裹;
因为在有些编程语言里是不支持闭包的,可能函数一执行完,函数里的局部变量就被销毁了,那么子函数是不能对父函数的变量做引用的;、
mdn闭包解释:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures#%E8%AF%8D%E6%B3%95%E4%BD%9C%E7%94%A8%E5%9F%9F
注意:
go除了var定义的变量名还有function定义的函数名,只是变量名都是undefiend在mianScript执行才会被赋值,而函数名已经执行和fo的内存地址;(这样对应了,基本数据类型的变量都是直接在栈中赋值,引用数据类型的变量在栈中赋值堆里的内存地址;)
ao应该是函数被压入ecs调用栈时才创建,而不是解析阶段就创建;(课三1‘10’‘)
二、闭包的使用场景
1.定义私有变量私有方法
似有变量:https://blog.csdn.net/yingleiming/article/details/118552386
私有方法:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures#%E8%AF%8D%E6%B3%95%E4%BD%9C%E7%94%A8%E5%9F%9F
2.闭包➕柯里化
三、闭包为什么会造成内存泄漏?
因为fn指向了bar函数对象,bar函数对象的parentScope又指向了父级函数的ao,所以只是一个从window可以访问到的属性,不会被标记清除算法垃圾回收掉;
可以做个测试:
四、闭包引用的ao对象的所有属性都不会被释放吗
不是的,只有被引用的才会被保留,其他的属性会释放;
在js执行阶段,我们看到函数的词法环境里,只有count可以正常输出,name并没有被绑定到闭包的词法环境中,会报错;