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并没有被绑定到闭包的词法环境中,会报错;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!