执行栈:JS线程执行JS代码的过程(异步)

执行栈

call stack

  • 本质:一块内存空间
  • 只要有一个函数被调用(函数声明不管),就会往执行栈里加入一个执行上下文
    • 执行上下文也是一块内存空间(记录函数执行的一些必须要的东西)
    • 没有执行上下文,函数无法执行
  • JS代码只会在执行栈执行,不可能在其他地方执行



JS线程执行JS代码的过程

举例:下面代码输出什么?
const a = 1;
console.log(a);

function A() {
  console.log('A');
  B();
}

function B() {
  console.log('B');
}

A();

答案是:
1
A
B


执行过程解析:
  • JS启动之前就会分配一块内存空间(执行引擎干的事),就是执行栈call stack

    • 所图所示:
      在这里插入图片描述

  • JS执行引擎会往执行栈内放入一块全局上下文

    • 全局上下文是一块内存空间,记录一些全局变量…
    • 如图所示:

在这里插入图片描述


  • 执行全局代码(代码从上往下执行)

    • const a = 1;//常量声明和赋值
      
    • console.log(a);//调用了log函数
      
  • 只要调用函数(无论是自己写的函数,还是浏览器写好的函数),就会产生新的上下文(该上下文记录函数内部的变量、声明的函数…)

  • 产生的对应上下文(log上下文),并入栈

    • console对象是浏览器写好的,此处调用了里面的log函数
    • 如图所示:

    在这里插入图片描述


  • 执行log函数

输出 : 1


  • log函数执行完毕,该函数的上下文被弹出,直接出栈

    • 所图所示:
      在这里插入图片描述

  • 又回到全局上下文,继续执行

    • 只要调用函数,就一定会产生新的上下文,并入栈

    • 在执行栈中,一定是先执行顶部的上下文

    • 函数声明不做处理

    • 代码从上往下执行,该执行的语句为:

    • A();//函数调用
      

  • 产生对应的函数A上下文,并入栈

    • 如图所示:
      在这里插入图片描述
  • 执行函数A

    • function A() {
        console.log('A');
        B();
      }
      
    • 代码从上往下执行,log函数被调用,产生log上下文,并入栈

    • 如图所示:

在这里插入图片描述

  • 输出 ‘A’ ,log函数执行完毕

  • log函数执行后,弹出log上下文,回到A上下文,继续执行A函数

  • 执行语句如下:

  • B();//函数被调用
    

  • 产生函数B的上下文,并入栈

  • 如图所示:

  • 在这里插入图片描述

  • 执行函数B

  • function B() {
      console.log('B');
    }
    
  • 代码从上往下执行,

  • console.log('B');//log函数被调用
    

  • 产生log上下文,并入栈,如图所示:

在这里插入图片描述

  • 输出 ’ B’

  • log函数执行完毕,弹出log上下文

  • 函数B,执行完毕,弹出B上下文

  • 函数A,执行完毕,弹出A上下文

  • 全局执行完毕,弹出全局上下文


  • 最后一条上下文出栈后,执行栈清空,整个程序运行结束。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值