目录
函数执行
发现函数 js引擎在内存的操作
1、编译时,发现函数,会创建一个全局对象,生成一个属性
2、创建一个函数对象(内存中开辟的空间,会有一个地址),包含父级作用域和函数执行体 3、在全局对象中属性的值是函数的内存地址
4、执行时,根据全局对象中获取到函数的内存地址,直接通过地址找到其函数对象 5、在调用栈会自动创建一个函数执行上下文(里面包含AO) ,在调用栈进行调用函数对象
AO:活跃对象,在函数执行之前会创建AO对象,会把函数接收的变量和形参等提升到AO对象中,
6、开始执行函数,接收传来的值并给形参赋上
7、一旦函数执行完函数执行上下文就会移除并被销毁(再次调用时,再重新走一遍步骤)
作用域链
函数的父级作用域和定义位置(编译时)有关系,与调用位置(执行时)无关
变量环境和变量记录
早期的版本中,在对代码编译时,会将定义的函数和变量添加到VO对象里。但现在改名为变量环境了,而添加在变量环境中的叫做环境记录
内存管理
定义:
不管什么编程语言都会在代码执行过程中给他分配内存,有些手动管理内存(c、c++),有些自动管理内存(java、javaScript、python、Swit)
内存管理生命周期:
1.内存分配
2.内存使用
3.内存回收
注:全局变量一般不回收(关闭页面时回收)
一般情况下局部变量的值不用了就自动回收掉
内存分配方式
对于基本数据类型会在执行时,直接放在栈区进行分配
对于复杂数据类型会在堆区开辟一块空间,并这块空间的指针返回值变量引用
内存泄露
定义:不在用到的内存,没及时释放
垃圾回收机制
GC,js中内存的分配和回收都是自动完成的,内存在不适用的时候会被垃圾回收机制回收
垃圾回收的算法
引用计数:就是看一个对象是否有指向它的引用
当一个对象有一个引用指向它时,这个对象的引用+1,当一个对象的引用为0时,就会被销毁
弊端:会产生循环引用( 两个对象互相引用) 导致大量得内存泄漏
标记清除法:
从根部(在js中就是全局对象)出发定时扫描内存中的对象。凡是能从根部到达的对象,都是还需要使用的,无法到达的就被标记为不在使用,稍后进行回收