执行上下文

93 阅读3分钟

执行上下文

  • 解析代码并不是一行一行去解析和执行,而是一段一段解析和执行。js中分段的代码目前有全局代码和函数。
  • 在执行某段js代码的时候会去进行一个准备工作,这个准备工作叫做执行上下文。
  • 执行上下文会进行四个操作包括-开辟一个内存空间、确定变量对象、完成作用域链、确定this指向。
  • 每执行一段代码,都会创建一个相应的执行上下文,所以在脚本中可能会存在很多执行上下文。
  • 由于有很多执行上下文,所以js会创建一个执行上下文栈用以管理执行上下文。
  • 当js解析代码时,首先遇到全局代码,会向执行上下文栈中压入全局执行上下文,全局的执行上下文是在页面关闭或者程序关闭的时候弹出。
  • 执行一个函数的时候 会创建一个函数的执行上下文,并压入到执行上下文栈中,只要函数执行完成,会将函数从栈里弹出。

变量对象

  • 变量对象是ECMAScript的规范术语,存储了当前执行上下文中所有的变量和函数声明。
  • 只有在执行上下文的时候变量对象才被激活,变量对象中的变量和方法才能被使用。
  • 全局执行上下文的变量对象其实就是全局对象window(全局的变量和函数就是window对象的属性和方法)
  • 进入执行上下文是,不会直接执行代码,会先对代码进行分析。
    • 首先会包含所有的形参和实参
    • 检查所有的函数声明,将整个函数提升到变量对象中,如果变量对象中已经有了相同名字的属性,则完全替换。
    • 检查所有的变量声明,放在变量对象中(只提升var..),如果变量名和已经声明的形参和函数声明相同,则不会影响。

作用域链

  • 是保证 对执行环境有权访问所有变量和函数(变量对象)的有序访问
  • 作用域链是在声明函数时产生的,在函数被调用的时候把当前函数的变量对象放入作用域链,完成作用域链。
  • 作用域链的最前端一定是当前执行上下文的变量对象,最末端一定是window
  • 标识符解析是沿着作用域链一级一级地搜索变量对象的过程,搜索过程一定是从作用域链的最前端开始,然后逐级向后回溯,直到找到标识符为止(如果找不到标识符,通常会导致错误的发生。)

this指向

  • 简要说明:this永远指向函数的调用者,如果找不到调用者,则指向全局对象window,同一个函数的调用方式不同,this指向可能会不同。
  • 判断this:
    • 判断有没有call和apply
    • 判断有没有new调用
    • 判断调用的时候(除了上两种情况外),有没有上下文对象,如果有则指向上下文对象
    • 函数默认调用(自己调用),指向window。