一、简介
在js引擎中对变量的存储主要有两种位置,堆内存和栈内存。
1.栈内存
栈内存主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null,**以及对象变量的指针,这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等。
2.堆内存
堆内存主要负责像对象Object这种变量类型的存储
栈内存中的变量一般都是已知大小或者有范围上限的,算作一种简单存储。而堆内存存储的对象类型数据对于大小这方面,一般都是未知的。个人认为,这也是为什么null作为一个object类型的变量却存储在栈内存中的原因。
因此当我们定义一个const对象的时候,我们说的常量其实是指针,就是const对象对应的堆内存指向是不变的,但是堆内存中的数据本身的大小或者属性是可变的。而对于const定义的基础变量而言,这个值就相当于const对象的指针,是不可变。
我们常说的值类型和引用类型其实说的就是栈内存变量和堆内存变量,再想想值传递和引用传递、深拷贝和浅拷贝,都是围绕堆栈内存展开的,一个是处理值,一个是处理指针。
//第一个i是随着放到函数放到堆中,第二个是i是放到了栈中,第三个块级作用域
for (var i = 0; i < 5; i++) {
;(function (j) {
setTimeout(function () {
console.log(j)
}, 0)
})(i)
}
// 结果 0 1 2 3 4
for (var i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i)
}, 0)
}
// 结果 5 5 5 5 5
// for (let i = 0; i < 5; i++) {
// setTimeout(function () {
// console.log(i)
// }, 0)
// }
// 结果 0 1 2 3 4