当前位置: 首页 > news >正文

银川如何做百度的网站百度快速排名用什

银川如何做百度的网站,百度快速排名用什,合水网站建设,新疆微信小程序开发JS调用栈:为何会栈溢出 JS调用栈什么是函数调用什么是栈在开发中利用调用栈栈溢出 JS调用栈 JavaScript 经常会出现一个函数中调用另外一个函数的情况,调用栈就是用来管理函数调用关系的一种数据结构,首先你要先弄明白函数调用和栈结构 什么…

JS调用栈:为何会栈溢出

  • JS调用栈
    • 什么是函数调用
    • 什么是栈
    • 在开发中利用调用栈
    • 栈溢出

JS调用栈

JavaScript 经常会出现一个函数中调用另外一个函数的情况,调用栈就是用来管理函数调用关系的一种数据结构,首先你要先弄明白函数调用栈结构

什么是函数调用

先来看一段简单的示例代码:

var a = 2
function add() {var b = 10return a + b
}
add()

下面利用这段简单的示例代码来解释下函数调用的过程(参考下图):

  1. 在执行函数 add() 之前,JavaScript 引擎会为上面这段代码创建全局执行上下文,代码中全局变量和函数都保存在这个全局上下文的变量环境中
  2. 执行上下文准备好之后,便开始执行全局代码,当执行到 add() 时,JavaScript 判断这是一个函数调用,那么将会从全局执行上下文中取出 add 函数代码
  3. 接下来对取出的 add 函数代码进行编译,并创建该函数的执行上下文和可执行代码
  4. 最后执行代码,输出结果

流程可以参考下图:

在这里插入图片描述

如果你不知道为何变量环境中的 a = undefined,建议你先去了解JS变量和函数提升

也就是说在执行 JavaScript 时,可能会存在多个执行上下文,那么 JavaScript 引擎是如何管理这些执行上下文的呢?

答案就是通过一种叫的数据结构。

什么是栈

栈就类似于一端被堵住的单行线,栈中的元素满足后进先出的特点。JavaScript 引擎正是利用栈的这种结构来管理执行上下文的,在执行上下文创建好后,JavaScript 引擎会将其压入栈中,通常这种用来管理执行上下文的栈称为执行上下文栈,又称调用栈call stack)。

为了更好的理解调用栈,下面来看一段稍微复杂点的示例代码:

var a = 2
function add(b, c) {return b + c
}
function addAll(b, c) {var d = 10result = add(b, c)return a + result + d
}
addAll(3, 6)
  1. 第一步,创建全局上下文,并将其压入栈底。变量 a 、函数 addaddAll 都保存在了全局上下文的变量环境对象中
  2. 此时已经没有声明变量和函数了,开始执行可执行代码,首先会执行 a = 2 的赋值操作
  3. 继续执行,调用 addAll() 函数。JavaScript 引起会编译该函数,并为其创建一个函数执行上下文,并将其压入栈中
  4. addAll 的执行变量中先定义 d = undefined,然后执行可执行代码时会执行 add() 函数
  5. add 函数创建函数上下文,并将其压入栈中
  6. add 函数返回时,该函数的执行上下文就会从栈顶弹出,并将 result 值设置为 add() 执行的返回值
  7. 紧接着 addAll() 执行最后一个操作后返回,addAll 的执行上下文也会从栈顶弹出,此时调用栈就只剩下全局上下文了
  8. 至此,整个 JavaScript 流程执行结束

流程图可参考下图:
在这里插入图片描述
调用栈是 JavaScript 引擎追踪函数执行的一个机制,当一次有多个函数被调用时,通过调用栈能够追踪到哪个函数正在被执行以及函数之间的调用关系。

在开发中利用调用栈

当我们在 add 函数返回值之前打入一个断点

function add(b, c) {debuggerreturn b + c
}

刷新页面,打开浏览器开发者中的 Source 面板
在这里插入图片描述
图中,Call Stack 下面显示出来的就是函数的调用栈,栈底部是 anonymous,也就是全局的函数入口,中间的是 addAll 函数,顶部是 add 函数,跟我们上面分析的执行流程图一样,这就清晰地反映了函数的调用关系。

除此以外,还可以使用 console.trace() 来输出当前的函数调用关系,比如将上面的 debugger 替换成 console.trace(),控制台打印结果如下:
在这里插入图片描述

栈溢出

调用栈是有大小的,当入栈的执行上下文超过一定数目,JavaScript 引擎就会报错,我们将这种错误叫做栈溢出。特别是在写递归的时候,很容易出现这种错误。比如下面的这段代码:

function division(a, b) {return division(a, b)
}
console.log(division(1, 2))

在这里插入图片描述
JavaScript 引擎调用函数 division 时创建函数执行上下文,压入栈中;执行 division 函数内部可执行代码时又遇到了 division 函数,所以它会再创建一个函数执行上下文,因为这个函数是递归且没有任何终止条件的,所以会一直反复创建函数执行上下文并压入栈中,但栈是有容量限制的,超过最大数量后就会出现栈溢出的错误。

http://www.hrbkazy.com/news/43094.html

相关文章:

  • 桂林创新大厦网站百度中心
  • 如何做淘宝二手网站网络广告人社区官网
  • 电子商务网站开发需要注意问题qq群排名优化软件购买
  • 网站建设的目的模板seo网站搜索优化
  • 一个朋友找我做网站该收多少钱有没有帮忙推广的平台
  • 长沙哪个平台做网站好高效统筹疫情防控和经济社会发展
  • 58招商加盟项目淘宝seo优化是什么
  • 外国黄网站色网址seo推广是什么工作
  • 南昌公司网站建设友情链接地址
  • 东莞网站优化如何北京网站优化专家
  • 做商城网站还要服务器站长工具大全集
  • 自己能建设网站网络营销10大平台
  • 用书籍上的文章做网站SEOseo官网优化详细方法
  • 二手设备回收做哪个网站好seo网站关键词优化方法
  • 真人性做爰网站百度下载安装官方下载
  • 宠物网站建设方案seo推广教程视频
  • wordpress导航网站模板建设网站的十个步骤
  • 企业网站能起到什么作用百度词条搜索排行
  • 怀化网站设计seo 优化技术难度大吗
  • 那里可以建网站谷歌商店paypal官网下载
  • 中式设计网站推荐淄博新闻头条最新消息
  • php模板建站搜狗引擎
  • 机械厂网站建设广州seo快速排名
  • 环保网站建设维护情况报告企业seo排名优化
  • 网站开发软件和工具ide和编辑器电商网站网址
  • 杭州做企业网站公司qq引流推广软件哪个好
  • 电子商务网站建设策划百度推广登录后台登录入口
  • 免费英文网站建设百度竞价多少钱一个点击
  • 中 网站建设 扬州seo整站优化公司持续监控
  • 帮其他企业做网站属于外包公司吗广州营销课程培训班