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并没有被绑定到闭包的词法环境中,会报错;

 

posted @ 2022-05-10 20:09  Eric-Shen  阅读(35)  评论(0编辑  收藏  举报