返回

全景式解析JavaScript执行上下文,全面阐述

前端

JavaScript执行上下文漫谈

JavaScript执行上下文是JavaScript代码执行的环境,它包含了变量对象、作用域链和当前执行的代码。执行上下文可以是全局上下文或局部上下文。全局上下文是JavaScript代码执行的默认环境,它在脚本执行之初创建,并且只有一个。局部上下文是在函数执行时创建的,每个函数都有自己的局部上下文。

执行上下文的三要素

一个执行上下文由三个要素组成:变量对象、作用域链和当前执行的代码。

  • 变量对象:变量对象是存储变量和函数的容器。每个执行上下文都有一个变量对象,它包含了在该执行上下文中声明的所有变量和函数。
  • 作用域链:作用域链是当前执行上下文和所有父执行上下文的变量对象的集合。作用域链决定了在当前执行上下文中可以访问哪些变量和函数。
  • 当前执行的代码:当前执行的代码是正在执行的代码。它可以是函数代码、脚本代码或事件处理函数代码。

执行上下文的创建过程

执行上下文在脚本执行之初创建,并且在函数执行时创建。

  • 全局执行上下文的创建:在脚本执行之初,JavaScript引擎会创建一个全局执行上下文。全局执行上下文的作用域链只包含一个元素,即全局对象。
  • 局部执行上下文的创建:在函数执行时,JavaScript引擎会创建一个局部执行上下文。局部执行上下文的变量对象包含了在该函数中声明的所有变量和函数。局部执行上下文的的作用域链包含了该函数的作用域链和所有父执行上下文的变量对象。

执行上下文的执行顺序

执行上下文按照创建的顺序依次执行。全局执行上下文首先执行,然后是局部执行上下文。在局部执行上下文中,函数代码按照从上到下的顺序执行。

变量访问

在执行上下文中访问变量时,JavaScript引擎会按照作用域链从当前执行上下文开始向上查找。如果在当前执行上下文中找不到该变量,则会继续在父执行上下文中查找。如果一直找到全局执行上下文都找不到该变量,则会报错。

作用域链

作用域链是当前执行上下文和所有父执行上下文的变量对象的集合。作用域链决定了在当前执行上下文中可以访问哪些变量和函数。作用域链的长度是可变的,它取决于执行上下文的嵌套层数。

总结

JavaScript执行上下文是JavaScript代码执行的环境。它包含了变量对象、作用域链和当前执行的代码。执行上下文可以是全局上下文或局部上下文。全局上下文是JavaScript代码执行的默认环境,它在脚本执行之初创建,并且只有一个。局部上下文是在函数执行时创建的,每个函数都有自己的局部上下文。

理解JavaScript执行上下文对于理解JavaScript代码的执行过程和变量的访问规则非常重要。