棧内存和堆内存
- 棧内存:提供了一个供JS代码执行的环境
- 全局作用域
- 私有所拥域
- 堆内存:存储引用数据类型的数据
- 函数数据类型:存代码字符串
- 对象数据类型:存键值对
内存释放
棧内存的形成和释放
- 全局作用域
- 形成:当浏览器加载完页面的时候,全局作用域形成
- 销毁 / 释放:关闭页面,关闭浏览器,关闭电脑...
- 私有作用域
- 当函数被调用的时候,形成私有作用域
- 销毁:一般当函数执行完成的时候,私有作用域就释放了,但是特殊情况除外;
- 不释放:如果函数中的东西,被外面的变量或其他的东西占用的时候,就无法释放
- 不立即释放:最典型的就是当函数执行完成的时候,返回一个函数的定义阶段,这个丁一阶段,还要再执行一次,当两次都执行完成的时候,私有作用域得到释放;
堆内存的形成和释放
- var obj = {} // 形成
- var fn = function(){} // 形成
- obj = null // 释放
- fn = null // 释放
垃圾回收机制
浏览器每隔一段时间,都会回收没用的内存,所以当我们不用哪个地址的时候,可以把占用这个地址的东西,执行空指针null,这样,等浏览器空闲的时候,就会把这个内存进行回收;
函数的定义 3 步骤
- 开辟一个空间地址
- 把函数体内所有的JS代码,作为字符串存在这个空间中
- 把这个空间地址赋值给函数名
函数的调用 4 步骤
- 形成一个私有作用域
- 形参赋值
- 预解释
- 代码从上到下执行
带var和不带var的区别
- 带var的:1)私有变量2)会进行预解释
- 不带var的:1)如果是设置,找不到,window.a = XXX;如果是获取,找不到,报错! XXX is not defined;2)不会进行预解释
作用域链
当函数被调用的时候,会形成一个私有作用域,看这个私有作用域中,是否有变量a,
1)如果有,该函数中所有的a都为私有变量
2)如果没有,往上级查找,一直找到window,还没有的话,报错 a is not defined
上级作用域
- 上级作用域跟函数在哪里调用无关,只跟函数队形的堆内存在哪个空间下开辟有关;