js引擎中内存的分类
- 堆内存:堆内存是用来储存数据类型的
- 栈内存:栈内存提供js代码执行的环境,并储存引用数据类型的数据的
js中堆栈内存的创建和释放
-
创建堆内存
- 创建一个引用数据类型的值(对象,数组,正则,时间,函数),这时浏览器会为这个引用数据类型创建一个堆内存,在这个堆内存中存储着这些引用数据类型的值.
-
堆内存的释放
- 让所有引用堆内存空间地址的变量赋值为null即可(没有变量占用这个堆内存了,浏览器会在空闲的时候把它释放掉)
-
创建栈内存
- 浏览器打开一个页面的时候,会首先形成一个顶层的栈内存,丫就是全局作用域window
- 函数执行时产生的私有作用域就是一个供函数代码执行的栈内存
- 函数每一次执行,都会形成一个全新的栈内存,即每次函数执行都是在一个全新的环境里面执行,所以函数每次执行都是互相独立的.
-
栈内存的销毁
- 顶层栈(全局作用域)销毁,页面关闭,全局作用域销毁
- 私有作用域销毁:一般情况下,函数执行后栈内存就销毁了,但是有些情况不会销毁
栈内存不销毁的特属情况
1.当函数执行完,如果返回了一个引用数据类型的值,且这个值被外面的属性或者变量接收,此时函数执行的作用域不会被销毁,储存在作用域中的值也不会销毁.
2.函数内部的引用数据类型被外部占用,函数执行的作用域不销毁。
let和const
- let和const的特点
- let和const都是es6新增的关键字,let用来声明变量, const用来声明常量
- let和const都不会进行变量提升,也就是说,如果在定义之前输出会报错
- let和const重复声明会报错: Uncaught SyntaxError: Identifier ‘a’ has already been declared( 未捕获的语法错误:标识符’num’已被声明)
- let和const在全局中声明不会给window增加属性
- let和const会受到块级作用域的影响,且一定情况下会出现暂时性死区
- 暂时性死区(tdz)
- 在代码块中,用let跟const声明的变量,不能在声明之前使用,这被称为暂时性死区
var num = 2;
{
num=3;
let num =3
}
- 过去typeof被称为最安全的运算符,因为用它来检测一个尚未声明的变量也不会报错,但是在es6出来之后,因为暂时性死区的原因就不再适用了.
- const声明常量的细节问题
- 1.声明常量时必须赋值,否则报错
(Uncaught SyntaxError: Missing initializer in const declaration
未能捕获的语法错误:用const声明时初始值缺失) - 2.常量一旦声明就无法改变,但如果声明的是一个引用数据类型,因为常量代表的是这个引用数据类型的空间地址,所以我们可以随意改变地址中的数据.但是不能修改常量存储的空间地址
- 1.声明常量时必须赋值,否则报错