JS的执行过程

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

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

执行上下文

有三处代码能够建立执行上下文post

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

执行上下文栈

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

建立执行上下文的过程

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

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

  // 做用域链
  'scopeChain': { /* variableObject + all parent execution context's variableObject */ }, 'this': {} } 复制代码

其建立过程以下指针

1)建立变量对象code

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

2)创建做用域链cdn

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

3)肯定this的指向blog

执行

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

最后

欢迎关注个人微博@狂刀二

相关文章
相关标签/搜索