标记清除「谷歌」
引用计数(老版本火狐和IE)
堆内存释放机制
- 如果当前堆内存的16进制地址被其他事物引用,则堆内存不能释放掉 强引用
- 如果没有东西占用这个堆内存,浏览器在空闲的时候,会把这些未被引用的堆内存“回收/释放”掉
let obj = {
name:"zhufeng"
};
obj = null;//让obj不指向对象的堆内存,这样上述对象就可以被释放掉了{手动释放堆内存的方法:赋值为null}
栈内存(执行上下文)释放机制
- 全局上下文是加载页面的时候产生的,也只有关闭页面的时候才释放。
- 私有上下文(不论是函数/块),一般情况,执行完都会释放掉,以此来优化栈内存;但是有特殊情况,如果当前上下文中,创建的某个东西(一般指一个对象{堆内存}),被上下文以外的其他事物占用了,那么不仅创建的这个东西不能被释放,和其有关联的这个私有上下文也不能释放!!
消耗内存(慎用);
因为不被释放,所以这个私有上下文中的东西都被保留下来,以后可以拿来用。
闭包机制:
函数执行会产生一个全新的私有上下文。
- 保护:保护里面的私有变量不受外界的干扰,防止全局变量污染;
- 保存:一旦这个上下文不被释放,里面的私有变量和值,就保存起来了,可以供其“下级”上下文中调取使用。
我们把函数执行产生的两大机制“保存/保护”,称之为闭包机制!!
词法分析
@1 我们从服务器端获取到的JS代码,本质就是一堆字符串,而浏览器会把这堆字符串,按照ECMA262规范,解析为自己可以识别的代码...我们把这个过程称之为“词法分析/解析”
@2 词法分析阶段,会把这堆代码变为浏览器可以识别的“树形结构 ==> AST语法树”
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!