名词解释
    调用堆:是解释器追踪函数执行流的一种机制,但执行环境中调用多个函数时,通过这种机制能够追踪到那个函数正在执行,执行函数体中有调用了那个函数。

    • 每调用一个函数,解释器就会把该函数添加进调用栈并开始执行。
    • 正在调用栈中执行的函数还调用了其他函数,那么新的函数也将会被添加进调用栈,一旦这个函数被调用,便会立即执行
    • 当前函数执行完毕后,解释器将其清空调用栈,继续执行当前执行环境下的剩余代码。
    • 当分配的调用栈空间被沾满时,会引发“堆栈溢出”。
      1. function greeting(){
      2. sayHi();
      3. }
      4. function sayHi(){
      5. return "Hi !"
      6. }
      7. greeting()
      上面代码执行流程:
    1. 忽略前面所有函数,直到greenting()函数被调用。
    2. 把greeting()添加进调用栈列表。
    3. 执行greeting()函数 中的所有代码

      调用栈列表

      • greeting
    4. 代码执行到sayHi()时,该函数被调用。

    5. 把sayHi() 添加进调用栈列表
    6. 执行sayHi()函数体中的代码,直到全部执行完毕
    7. 返回来继续执行greeting()函数体中sayHi()后面的代码。
    8. 删除调用栈列表中sayHi()函数
    9. 当greeting()函数体中的代码全部执行完毕,返回到调用greeting()的代码行,继续执行剩下的JS代码

      调用栈列表

      • greeting
    10. 删除调用栈列表的greeting()函数

    总结,一开始我们得到一个空空如也的调用栈,随后,每当有函数被调用都会自动添加进调用栈,执行完函数中的代码后,调用栈又会自动的移除这个函数,最后,我们又得到一个空空如也的调用栈