JavaScript高级-作用域链-内存管理
1.当我们查找一个变量时,真实的查找路径是沿着作用域链来查找
案例:
2.跟它的定义位置有关系,跟调用位置没关系,输出Hello Global.
3.变量环境和记录
4.案例面试题
面试题一
打印出200
面试题二
输入undefined,和200
第三题面试题
没写var,浏览器直接放到全局了
第四题
a输出undefined,b输出10
4. 认识内存管理
1.不管什么样的编程语言,在代码的执行过程中都是需要给它分配内存的,不同的是某些编程语言需要我们自己手动的管理内存,某些编程语言会可以自动帮助我们管理内存
2.不管什么的方式来管理内存,内存的管理都会有如下的生命周期:
第一步:分配申请你需要的内存(申请);
第二步:使用分配的内存(存放一些东西,比如对象等);
第三步:不需要使用时,对其进行稀放;
3.不同的编程语言对于第一步和第三步会有不同的实现:
手动管理内存:比如C、C++,包括早期的OC,都是需要手动来管理内存的申请和稀放的(malloc和free函数);
自动管理内存:比如Java、JavaScript、Python、Swift、Dart等,它们有自动帮助我们管理内存;
4.我们可以知道JavaScript通常情况下是不需要手动来管理的。
5. JS内存管理
JavaScript会在定义变量时为我们分配内存。
但是内存分配方式是一样的吗?
JS对于基本数据类型内存分配会在执行时,直接在栈空间进行分配;
JS对于复杂数据类型内存的分配会在堆内存中开辟一块空间,并且将这块空间的指针返回值变量引用;
6. JS的垃圾回收
1.因为内存的大小是有限的,所以当内存不再需要,我们需要对其进行释放,以便腾出更多的内存空间。
2.在手动管理内存的语言中,我们需要通过一些方式自己来稀放不再需要的内存,比如free函数。
但是这种管理的方式其实非常的低效,影响我们编写逻辑的代码的效率;
并且这种方式对开发者的要求也很高,并且一不小心就会产生内存泄露;
3.所以大部分现代的编程语言都是有自己的垃圾回收机制:
垃圾回收的英文是Garbage Collection,简称GC;
对于那些不再使用的对象,我们都称为垃圾,它需要被回收,以稀饭更多的内存空间;
而我们的语言运行环境,比如Java的运行环境JVM,JavaScript的运行环境js引擎都会内存垃圾回收器;
垃圾回收器我们也会简称为GC,所以在很多地方你看到GC其实指的是垃圾回收器;
4.但是这里又出现了另一个很关键的问题:GC怎么知道哪些对象是不再使用的呢?
这里就要用到GC的算法了。
7.常用的GC算法-- 引用计数
当一个有一个引用指向它时,那么这个对象的引用就+1,当一个对象的引用为0时,这个对象就可以被销毁;
这个算法有一个很大的弊端就是会产生循环引用;
8.常用的GC算法-- 标记清楚
- 这个算法是设置一个根对象,垃圾回收器会定期从这个根开始,找所有的根开始有引用到的对象,对于哪些没有引用到的对象,就认为不可用的对象;
- 这个算法可以很好解决循环引用的问题
JS引擎比较广泛的采用的就是标记清除算法,当然类似于V8引擎进行更好的优化,它在算法的实现细节上也会结合一些其他的算法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现