js-调用栈机制与ES6尾调用优化介绍

调用栈的英文名叫做Call Stack,大家或多或少是有听过的,但是对于js调用栈的工作方式以及如何在工作中利用这一特性,大部分人可能没有进行过更深入的研究,这块内容可以说对我们前端来说就是所谓的基础知识,咋一看好像用处并没有很大,但掌握好这个知识点,就可以让我们在以后可以走的更远,走的更快! 博客、前端积累文档、公众号、GitHub目录数据结构:栈调用栈是什么?用来做什么?调用栈的运行机制调用栈优化内存调用栈debug大法数据结构:栈栈是一种遵从后进先出(LIFO)原则的有序集合,新元素都靠近栈顶,旧元素都接近栈底。 生活中的栗子,帮助一下理解: 餐厅里面堆放的盘子(栈),一开始放的都在下面(先进),后面放的都在上面(后进),洗盘子的时候先从上面开始洗(先出)。 调用栈是什么?用来做什么?调用栈是一种栈结构的数据,它是由调用侦组成的。调用栈记录了函数的执行顺序和函数内部变量等信息。调用栈的运行机制机制: 程序运行到一个函数,它就会将其添加到调用栈中,当从这个函数返回的时候,就会将这个函数从调用栈中删掉。 看一下例子帮助理解: // 调用栈中的执行步骤用数字表示printSquare(5); // 1 添加function printSquare(x) { var s = multiply(x, x); // 2 添加 => 3 运行完成,内部没有再调用其他函数,删掉 console.log(s); // 4 添加 => 5 删掉 // 运行完成 删掉printSquare}function multiply(x, y) { return x * y;}调用栈中的执行步骤如下(删除multiply的步骤被省略了): 调用侦: 每个进入到调用栈中的函数,都会分配到一个单独的栈空间,称为“调用侦”。 在调用栈中每个“调用侦”都对应一个函数,最上方的调用帧称为“当前帧”,调用栈是由所有的调用侦形成的。 找到一张图片,调用侦: 调用栈优化内存调用栈的内存消耗: 如上图,函数的变量等信息会被调用侦保存起来,所以调用侦中的变量不会被垃圾收集器回收。 当函数嵌套的层级比较深了,调用栈中的调用侦比较多的时候,这些信息对内存消耗是非常大的。 针对这种情况除了我们要尽量避免函数层级嵌套的比较深之外,ES6提供了“尾调用优化”来解决调用侦过多,引起的内存消耗过大的问题。 何谓尾调用: 尾调用指的是:函数的最后一步是调用另一个函数。 function f(x){ return g(x); // 最后一步调用另一个函数并且使用return}function f(x){ g(x); // 没有return 不算尾调用 因为不知道后面还有没有操作 // return undefined; // 隐式的return}尾调用优化优化了什么? ...

May 21, 2019 · 1 min · jiezi