JavaScript 中的堆栈调用

在介绍 JavaScript 之前,先介绍一下数据的类型

  • 基本类型 (按值访问) 包括:Number 、 String 、 Boolean、 Undefined、Null 
  • 引用类型   (按引用访问)   包括:Object、 Array

 

介绍一下堆和栈

栈 (stack) : 用来保存简单的数据字段

堆 (heap) :    用来保存栈中简单数据字段对指针的引用

基本类型、引用类型数据以及 堆栈的关系如下图:

如上图所示,栈内存中 关于 引用类型的数据的是通过指针(地址)来引用的,指针和地址指向堆内存中的数据。
为啥为导致上述区别,是因为:

  • 基本类型的数据简单,所占用空间比较小,内存由系统自动分配
  • 引用类型数据比较复杂,复杂程度是动态的,计算机为了较少反复的创建和回收引用类型数据所带来的损耗,就先为其开辟另外一部分空间——及堆内存,以便于这些占用空间较大的数据重复利用。堆内存中的数据不会随着方法的结束立即销毁,有可能该对象会被其它方法所引用,直到系统的垃圾回收机制检索到该对象没有被任何方法所引用的时候才会对其进行回收

举个?(基本数据类型):

var  a = 1;
var  b = a;
b = 2;
console.log(a, b) // 1, 2

执行上述代码  var b = a 过程中,系统实际上会为 b 单独创建一个空间,当 执行 b = 2 的时候,所以就和 a 没有任何关系

再举个?:

var  obj1 = {a: 1, b: 2};
var  obj2 = obj1;
obj2.a = 20;
console.log(obj1.a, obj2.a) // 20, 20

当执行上述代码  obj1 = obj2 的时候,只是将 obj2 的指针指向 obj1,也就是说 obj1 和 obj2 的指针指向的是统一个数据地址,当执行 obj2 = 20 时,结果也就自然知晓了
 

既然已经知道的数据的类型在堆栈中的引用方式,接下来我们再思考一下,根据上面的介绍,貌似对每声明一个变量就会向堆栈中添加一个值,事实也的确如此:
我们再来看一个?:

function a() {
  b()
}
function b() {
  c()
}
function c() {
  console.trace() // 查看当前函数的调用帧
}
a()

通过以上 代码 的执行 以及控制太打印结果,会发现,函数的调用的进栈和出栈的顺序,遵循 先进后出 的原则

既然调用是用来放置调用帧的地方,那么我们是否会考虑到 调用栈是不是可以无限的放置 调用帧,答案毋庸置疑当然是不可以的
看下面的?:

function a() {
  b()
}
function b() {
  a()
  console.trace()
}
a()

控制台直接告诉我们已经超出了最大栈,也就是说我们刚才的死循环会导致 栈溢出
图示如下:

既然会存在栈溢出,那就可以避免我们向栈中添加过于长的 调用帧,也就是说调用越少,所占用的内存空间就越少,性能自然就更好了,关于调用帧的优化,最需要注意的就是为调用优化


尾调用优化:
关于尾调用优化,阮一峰 老师的 es6 入门教程已经描述的相当清楚明了,简单易懂,在这里就不再复制黏贴代码了,连接 尾调用优化 
 

其它前端性能优化:


-  图片优化——质量与性能的博弈  https://blog.csdn.net/woleigequshawanyier/article/details/86150763
-  浏览器缓存机制介绍与缓存策略剖析 https://blog.csdn.net/woleigequshawanyier/article/details/86152516
-  webpack 性能调优与 Gzip 原理 https://blog.csdn.net/woleigequshawanyier/article/details/85273790
-  本地存储——从 Cookie 到 Web Storage、IndexDB  https://blog.csdn.net/woleigequshawanyier/article/details/86290178
- CDN 的缓存与回源机制解析 https://blog.csdn.net/woleigequshawanyier/article/details/86369933
- 服务端渲染的探索与实践 https://blog.csdn.net/woleigequshawanyier/article/details/86370471
- 解锁浏览器背后的运行机制 https://blog.csdn.net/woleigequshawanyier/article/details/86371159
- DOM 优化原理与基本实践 https://blog.csdn.net/woleigequshawanyier/article/details/86371425
- Event Loop 与异步更新策略 https://blog.csdn.net/woleigequshawanyier/article/details/86371850
- 回流(Reflow)与重绘(Repaint)https://blog.csdn.net/woleigequshawanyier/article/details/86372288
- Lazy-Load https://blog.csdn.net/woleigequshawanyier/article/details/84930082
- 事件的节流(throttle)与防抖(debounce)  https://blog.csdn.net/woleigequshawanyier/article/details/85345095
- 前端学习资料下载 https://blog.csdn.net/woleigequshawanyier/article/details/85274358
- 技术体系分类 https://blog.csdn.net/woleigequshawanyier


前端技术架构体系(没有链接的后续跟进):


- 调用堆栈 https://blog.csdn.net/woleigequshawanyier/article/details/85038675
- 作用域闭包 https://blog.csdn.net/woleigequshawanyier/article/details/85214354
- this全面解析 
- 深浅拷贝的原理 https://blog.csdn.net/woleigequshawanyier/article/details/85331237
- 原型prototype https://blog.csdn.net/woleigequshawanyier/article/details/85338995
- 事件机制、
- Event Loop https://www.jianshu.com/p/12b9f73c5a4f
- Promise机制、
- async / await原理、
- 防抖/节流原理  https://blog.csdn.net/woleigequshawanyier/article/details/85345095
- 模块化详解、
- es6重难点、
- 浏览器熏染原理、
- webpack配置(原理) https://blog.csdn.net/woleigequshawanyier/article/details/85273790
- 前端监控、
- 跨域和安全、
- 性能优化(参见上面性能优化相关)
- VirtualDom原理、
- Diff算法、
- 数据的双向绑定
- TCP协议(三次握手、四次挥手) https://blog.csdn.net/woleigequshawanyier/article/details/85223642
- DNS域名解析 https://blog.csdn.net/woleigequshawanyier/article/details/85222985

其它相关


- 前端学习资料下载 https://blog.csdn.net/woleigequshawanyier/article/details/85274358
- 技术体系分类 https://blog.csdn.net/woleigequshawanyier
- react-native 实战项目学习 https://github.com/15826954460/BXStage
- react-naitve 采坑笔记  https://blog.csdn.net/woleigequshawanyier/article/category/8512330

欢迎各位看官的批评和指正,共同学习和成长
希望该文章对您有帮助,你的 支持和鼓励会是我持续的动力

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值