闭包 与 js内存管理
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management
https://blog.csdn.net/weixin_55862315/article/details/124547271
闭包:
闭包就是一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。
在
JavaScript
中,每当创建一个函数,闭包就会在函数创建的同时被创建出来,作为函数内部与外部连接起来的一座桥梁。 现代浏览器下,闭包不会成为内存泄漏的直接原因。
js内存管理:
- 垃圾回收
| 引用
垃圾回收算法主要依赖于引用的概念。在内存管理的环境中,一个对象如果有访问另一个对象的权限(隐式或者显式),叫做一个对象引用另一个对象。
| 引用计数垃圾收集
这是最初级的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。
限制:循环引用
该算法有个限制:无法处理循环引用的事例。
| 标记 - 清除算法
这个算法把“对象是否不再需要”简化定义为“对象是否可以获得”。
这个算法假定设置一个叫做根(root)的对象(在 Javascript 里,根是全局对象)。垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象……从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。
这个算法比前一个要好,因为“有零引用的对象”总是不可获得的,但是相反却不一定,参考“循环引用”。
从 2012 年起,所有现代浏览器都使用了标记 - 清除垃圾回收算法。
循环引用不再是问题了。
在上面的示例中,函数调用返回之后,两个对象从全局对象出发无法获取。因此,他们将会被垃圾回收器回收。第二个示例同样,一旦 div 和其事件处理无法从根获取到,他们将会被垃圾回收器回收。
限制:那些无法从根对象查询到的对象都将被清除
尽管这是一个限制,但实践中我们很少会碰到类似的情况,所以开发者不太会去关心垃圾回收机制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | ( function () { // -- 基础数据类型 { function func (val = 0) { return { decrease() { val-- }, increase() { val++ }, getVal() { return val } } } const props = 0 const instance1 = func(props) const instance2 = func(props) console.log(instance1.getVal()) // 0 console.log(instance2.getVal()) // 0 console.log(props) // 0 instance1.increase() console.log(instance1.getVal()) // 1 console.log(instance2.getVal()) // 0 console.log(props) // 0 } // -- 引用数据类型 { console.log( '-- -- --' ) function func (param = { val: 0 }) { return { decrease() { param.val-- }, increase() { param.val++ }, getVal() { return param.val } } } const props = { val: 0 } const instance1 = func(props) const instance2 = func(props) console.log(instance1.getVal()) // 0 console.log(instance2.getVal()) // 0 console.log(props.val) // 0 instance1.increase() console.log(instance1.getVal()) // 1 console.log(instance2.getVal()) // 1 console.log(props.val) // 1 } }()) |
----------- 赠人玫瑰,手有余香 如果本文对您有所帮助,动动手指扫一扫哟 么么哒 -----------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端