浏览器中堆栈内存的底层处理

执行栈

JS引擎想要执行代码,一定会创建一个执行栈,也就是我们称为的:
栈内存(ECstackl)执行上下文环境栈

栈内存的第一个作用:

用来执行代码

JS中,某个域下的代码执行,都有自己的执行上下文。将创建好的执行上下文压缩到js中的栈内存中执行的这个过程,有一个专业的名词:进栈
创建的执行上下文,又分为两种:
全局EC(G) 这里的G指的是global 简写
函数EC (…)

在这里插入图片描述
当有的上下文被执行完毕后,就没用了。我们称之为:出栈
然而,有的上下文执行完毕后,还有用,会将其压缩至栈的底部,等待下次调用,(也就是上下文并没有被销毁),这种机制也有一个专业的名词叫做:闭包

这里面,又涉及到一个专业的名词叫做全局对象(GO) globla obeject 在浏览器端,会把全局对象赋值给window 。所有在我们全局的执行上下文中,一定包含GO(全局对象)

栈内存的第二个作用

存储基本类型值(比如全局对象我们创建个变量,就会被存进栈里面)
这里面有一个非常重要的概念,看下例子

let  a = 10;
//这个变量会被我们存进栈里面

我们定义了一个变量很简单,下面我们来看一下,他是怎么实现变量的赋值创建的。
所有变量赋值分为三步创建(如果已经创建就不会再创建了)
变量赋值三步操作:
(1)创建变量(声明 declare)
(2)创建值:基本值直接再栈内存中创建和存储即可
(3)让变量和值关联起来(赋值) defined 定义

所以,我们通常只声明了变量但是未定义的话,js就会报错 undefined (未定义)

let  a = 10;
let b =a;

这个时候,我们又创建一个变量b,因为b=a,a已经被创建了。所以就不用再创建值了,只需要进行关联,b=a会直接通过 指针指向a的值,也就是10.所以b等于10
这里我提到了一个重要的概念,指针。其实编程语言对数据的底层处理机制,变量的指针,都是通过指针来实现的。指针的概念就是,变量和一个值的关联,叫做关联 指针。

let  a = 10;
let b =a;
b = 13;

这个时候,我们赋值b=13,这个时候b已经被声明了。所以不需要重新声明,这是浏览器防止重新声明 的一个过程。然后需要新创建一个值13,将它放入到栈里面(所以,只要是按照这个机制,值都会被创建,哪怕值是一样的)
js中一个变量只能指向一个值,对b重新赋值,是不影响a的。所以,b=13, 那么a就等于10。

讲一个题外话,就是js中,有两种定义值的方法,可以定义变量和常量
变量和常量最本质的区别就在于,变量的指向可以变,而常量,每个值都是单独的。指针是不可以变的,变了就会报错。
ES6中出现了const,它不叫真正常量,它的专业语法叫做不可变的变量,或者叫做指针不可改变的变量。

创建引用类型

let a = {
n:12
}
let b = a;
b['n'] = 13;
console.log(a.n)

引用值的创建有所不同,由于引用值是复杂的解构,所以特殊处理。
处理引用值:
(1)开辟一个存储对象中键值对(存储函数中代码)的内存空间,就是“堆内存”。
所以堆内存只有一个作用,存储引用类型的值。
(2)所有的堆内存都有一个可被后续查找的16进制地址
(3)所以后续关联赋值的时候,是把堆内存地址给予变量操作的。
这也就是为什么我们称它为引用类型的原因,因为它操作的都是引用地址。

回到上方例子,通过b[‘n’] = 13 会直接影响到a.n的值,因为a和b绑定的是一个地址。

引用类型操作

let a = {
n:12
}
let b = a;
b={
n:13
}
console.log(a.n)

因为是引用类型,所以肯定重新创建了一个堆。
a的堆地址等于 a1.
然后b等于a,所以b的堆地址也等于a1
b={} 所以b重新创建了一个引用值,并生成了一个新堆b1.这个时候b的指向就是b1。
这个时候,a和b都有了自己的指向,所以a.n等于12.

知识点:堆内存一旦被创建,是不可以被销毁的。如果想销毁可以让该引用类型直接等于null.
null:空对象.通过把指针指向一个空指针,来实现我们对某个内存的释放。

日常工作中,我们定义一个变量,如果后期想赋值,我们就定义它的值为null.因为如果只声明,不创建值会等于undefined。我也见过很多等于0的,其实不建议这种操作,因为等于0,也会在栈中开内存。而null是不开内存的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

画不完的饼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值