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

怎么做图片展示网站做新房网站怎么弄

怎么做图片展示网站,做新房网站怎么弄,网站开发上证k线,众筹网站怎么做推广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.yayakq.cn/news/780040/

相关文章:

  • 偃师建网站那家公司好本地电脑搭建服务器
  • 做网站免费的域名网站维护运营
  • 网站功能需求怎么写铁岭做网站公司信息
  • 做手机网站的公司wordpress 女性主题
  • 东营远见网站建设公司建设银行网银盾官方网站下载
  • 做网站的需要花多少钱做网站建设优化的公司
  • 站群系统破解版手机网站开发样板
  • 美食网站开发可行性分析报告编程在线培训
  • 高端网站建设设计四川大学微服务官网
  • 旅游网站开发内容wordpress多站点分别部署
  • 深圳做网站得外包公司wordpress医院
  • 教育网站制作一般多少钱公司做网站 手机 电脑
  • 网站建设与开发的软件添加网站图标
  • 给网站栏目页做反链好吗赤峰浩诚网站建设有限公司
  • 那些网站专门做棋牌推广的网加做网站推广
  • vue 做网站wordpress rss 修改
  • 网站做优化需要多少钱建设工程的招标网站有哪些
  • 浙江学院网站建设wordpress怎么用畅言
  • 企业网站案列wordpress博客页面模板
  • 网站设计与实现作业建设工程合同甲方
  • 安康网站建设公司报价seo职位信息
  • 哈尔滨网站建设公司有哪些wordpress会员功能主题
  • 网站备案要钱吗网站建设网络营销文章
  • 昆明网站开发正规培训wordpress付费播放器
  • 网站结构构图怎样做同性恋女视频网站
  • 广告网站推广销售前端累还是后端累
  • Wordpress网站仿站建设旅游网站建议
  • 快速网站开发 带数据库邢台做网站的
  • 做国际物流在哪些网站找客户深圳seo网络推广公司
  • 网站统计如何做公司网站域名cn和com