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

共享空间网站开发公司广西地矿建设集团网站

共享空间网站开发公司,广西地矿建设集团网站,网站建设延期报告,设计师在线网站JS调用栈#xff1a;为何会栈溢出 JS调用栈什么是函数调用什么是栈在开发中利用调用栈栈溢出 JS调用栈 JavaScript 经常会出现一个函数中调用另外一个函数的情况#xff0c;调用栈就是用来管理函数调用关系的一种数据结构#xff0c;首先你要先弄明白函数调用和栈结构 什么… JS调用栈为何会栈溢出 JS调用栈什么是函数调用什么是栈在开发中利用调用栈栈溢出 JS调用栈 JavaScript 经常会出现一个函数中调用另外一个函数的情况调用栈就是用来管理函数调用关系的一种数据结构首先你要先弄明白函数调用和栈结构 什么是函数调用 先来看一段简单的示例代码 var a 2 function add() {var b 10return a b } add()下面利用这段简单的示例代码来解释下函数调用的过程参考下图 在执行函数 add() 之前JavaScript 引擎会为上面这段代码创建全局执行上下文代码中全局变量和函数都保存在这个全局上下文的变量环境中执行上下文准备好之后便开始执行全局代码当执行到 add() 时JavaScript 判断这是一个函数调用那么将会从全局执行上下文中取出 add 函数代码接下来对取出的 add 函数代码进行编译并创建该函数的执行上下文和可执行代码最后执行代码输出结果 流程可以参考下图 如果你不知道为何变量环境中的 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)第一步创建全局上下文并将其压入栈底。变量 a 、函数 add 和 addAll 都保存在了全局上下文的变量环境对象中此时已经没有声明变量和函数了开始执行可执行代码首先会执行 a 2 的赋值操作继续执行调用 addAll() 函数。JavaScript 引起会编译该函数并为其创建一个函数执行上下文并将其压入栈中addAll 的执行变量中先定义 d undefined然后执行可执行代码时会执行 add() 函数为 add 函数创建函数上下文并将其压入栈中当 add 函数返回时该函数的执行上下文就会从栈顶弹出并将 result 值设置为 add() 执行的返回值紧接着 addAll() 执行最后一个操作后返回addAll 的执行上下文也会从栈顶弹出此时调用栈就只剩下全局上下文了至此整个 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.w-s-a.com/news/721881/

相关文章:

  • 产品网站建设找哪家舟山信息港
  • 唐山网站建设汉狮怎么样seol英文啥意思
  • 深圳小程序网站开发公司网页制作模板视频教程
  • 电子商务网站开发开题报告wordpress更改后台地址
  • 网站静态前端是什么工作
  • 餐饮门户网站 方案怎么做创业好项目
  • 做百度手机网站推广普通话的宣传标语
  • 记事本可以做网站吗网站服务器是主机吗
  • 手机网站被拦截怎么办怎么解决东营建设信息网网
  • 外贸网站模板免费微信网站开发技术
  • 视频盗版网站怎么做福州网站seo
  • 成都金铭 网站建设做网站包含的技术
  • 长沙的网站建设公司哪家好做网站应选那个主题
  • 公司网站百度搜不到如何自己做一个网站
  • 学生如何建设网站网站开发程序
  • 网站建设公司哪家好 皆来磐石网络网站建设"淘宝网" 在颜色选取和搭配方面有哪些值得学习的地方.
  • 网站如何做移动规则适配北京住房与城乡建设部网站
  • 课堂阵地建设网站wordpress运行机制
  • 网站建设的需求方案企业网站建设费用明细
  • 创口贴网站模板京创影视app
  • 团购网站建设目的网站有很多304状态码
  • 运用阿里云怎么做网站外资企业可以在中国境内做网站吗
  • 云南住房和城乡建设局网站西安做官网的公司
  • 企业网站图片上传网站建设和应用的情况
  • 网站不显示内容吗聊城网架公司
  • 南昌网站建设企业网站托管外包怎么做
  • 做非洲外贸的网站网站可以用PS设计吗
  • PHP搭建IDC网站青岛福瀛建设集团网站
  • 安徽网站优化多少钱软件界面设计的基本原则
  • 网站建设动态页面修改删除dnf卖飞机的网站怎么做的