返回

大杂烩中的JavaScript执行上下文

前端

如果想深入理解JavaScript,那么就不能逃避JavaScript的执行上下文中的这些基本概念:执行上下文、词法环境、变量环境,变量对象、活动对象、作用域链、闭包、提升、this,执行栈等。许多开发者对这些概念往往是一知半解,究其原因在于脱离了环境,或者不理解它们的具体含义。

本篇文章将从最基础的概念开始讲解,帮助你对这些概念形成清晰的理解。

执行上下文

执行上下文是JavaScript代码执行的环境,它决定了代码的执行方式和变量的访问权限。JavaScript代码在执行时,会创建一个执行上下文。一个执行上下文的创建,就是将一个函数作为参数,传递给JavaScript解释器,然后解释器就创建一个执行上下文,把该函数作为上下文中的当前代码,然后执行该函数。

当一个执行上下文被创建时,它将包含以下信息:

  • 当前执行的代码
  • 当前代码的作用域链
  • 当前代码的变量环境
  • 当前代码的this值

词法环境

词法环境是一个包含了代码中所有标识符的名称和值的集合。词法环境在代码编译时就已经确定,并且在代码执行期间不会改变。

变量环境

变量环境是词法环境的一个子集,它包含了代码中所有声明的变量和函数。变量环境在代码执行时创建,并且在代码执行期间可以改变。

变量对象

变量对象是一个包含了代码中所有声明的变量和函数的对象。变量对象在代码执行时创建,并且在代码执行期间可以改变。

活动对象

活动对象是当前正在执行的函数的执行上下文。活动对象包含了当前函数的所有局部变量和参数。

作用域链

作用域链是当前执行上下文的作用域链中的所有变量环境的集合。作用域链用于确定代码中变量的访问权限。

闭包

闭包是一个内部函数可以访问其外部函数作用域中声明的变量的函数。闭包在JavaScript中非常常见,并且在许多情况下非常有用。

提升

提升是指JavaScript在执行代码之前,将所有声明的变量和函数都提升到当前作用域的顶部。提升只对声明的变量和函数有效,对赋值操作无效。

this

this的值是当前正在执行的函数的执行上下文。this关键字的值在函数执行时确定,并且在函数执行期间可以改变。

执行栈

执行栈是一个存储JavaScript代码执行时所创建的执行上下文的栈。执行栈是后进先出(LIFO)的,这意味着最后创建的执行上下文将首先被执行。

这些概念看似复杂,但只要理解了它们之间的关系,就不会那么难理解了。下一次,当你遇到这些概念时,试着把它们放在一个整体的上下文中去理解,你就会发现它们其实并不那么难理解。