当前位置: 首页 > 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.yayakq.cn/news/924382/

相关文章:

  • 青岛做网站电话icp网站 是什么意思
  • 转运网站开发京东网站建设流程图
  • 建好网站是不是每年都要交钱企业的网站设计能否以为导向
  • 爱站网主要功能镇江网站搭建
  • 大理做网站哪家好网站模板自建站
  • asp制作网站教程厚街镇网站仿做
  • 自己做的网站如何包装网站排名标准
  • 全球最大源码共享网站微商分销模式有哪些
  • 网站技术解决方案不包括怎么弄一个微信小程序
  • 深圳网站改版公司海外服务器租用多少钱一年
  • 网站建设亿玛酷正规如何建一个免费网站
  • 云南省住房和建设执业资格注册中心网站wordpress 文章导入
  • 网站怎么进行优化排名网站开发协助方案
  • 网站备案注意事项一个微信可以做两个网站支付宝吗
  • 怎么才能创建个人网站企业自建站案例
  • 网站项目开发流程加强图书馆网站建设
  • 网站开发_去哪里找页面wordpress 社交账号 文章评论 ds-thread
  • 做物流的可以在那些网站找客户端网站建设论文框架
  • 手机网站制作参考资料文献鄂州网站设计效果
  • 图片瀑布流网站模板中国小说网站策划与建设
  • 南宁手机网站建设公司电子商务网站建设的相关流程
  • 礼品行业网站建设婚纱网站建设微信群
  • 宜宾有什么大型网站建设公司wordpress迅雷下载地址
  • 做网站用微软雅黑有那种做拼贴的网站吗
  • 接设计网站商务型网站
  • 厦门外贸网站建设报价水网站源码
  • 建设微网站多少钱园区网站建设调研报告
  • 网站备案ps海南房产
  • gif图片动态素材网站手机网站页面设计尺寸
  • 济南app网站建设12333网上服务大厅