JS的执行过程

JS是脚本语言,但它也会经过编译,编译就发生在代码执行前的极短时间内(微妙级甚至更短)

编译器进行代码生成时,会创建执行上下文。

执行上下文

有三处代码可以创建执行上下文

  • 全局代码:执行全局代码会创建全局执行上下文,有且只有一个全局执行上下文
  • 函数:执行函数会创建函数执行上下文
  • eval()函数:执行eval()函数会创建Eval函数执行上下文

执行上下文栈

这些上下文构成一个执行上下文栈,新的上下文会添加到栈的顶部,执行完则出栈,直到再次到达全局执行上下文。

创建执行上下文的过程

每个执行上下文有三个重要属性:变量对象(Variable Object),作用域链(Scope chain)和this

executionContextObj = {
  // 变量对象
  'variableObject': { /* function arguments / parameters, inner variable and function declarations */ },

  // 作用域链
  'scopeChain': { /* variableObject + all parent execution context's variableObject */ },

  'this': {}
}
复制代码

其创建过程如下

1)创建变量对象

  • 创建 arguments 对象:创建 arguments 对象,该对象中包含实参,此过程仅在函数(非箭头函数)中进行。
  • 函数声明提升:每发现一个函数声明,在变量对象中创建与函数名相同的属性,值是指向这个函数的指针,如果这个函数名已存在,则重写这个指针的值。
  • 变量声明提升:每发现一个变量声明,在变量对象中创建与变量名相同的属性,值初始化为undefined,如果变量名已存在,则什么也不做。

2)建立作用域链

作用域就是上面的变量对象,作用域链就是由当前执行上下文的变量对象与所有上层执行上下文的变量对象组成的带头结点的单向链表。

3)确定this的指向

执行

执行过程中最重要的就是事件循环

最后

欢迎关注我的微博@狂刀二

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值