执行上下文、作用域和词法环境

57 阅读3分钟

执行上下文

定义

  • 执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,JavaScript中运行任何代码都是在执行上下文中运行,执行上下文共三种类型
  • 是JavaScript 执行代码的环境
  • 创建执行上下文时会进行this绑定、创建词法环境和变量环境

分类

  • 全局执行上下文:默认的、最基础的执行上下文,不在任何函数中的代码都位于全局执行上下文中
    • 创建一个全局对象,在浏览器中这个全局对象就是window对象(非严格模式)
    • 将this指针指向这个全局对象,一个程序中只能存在一个全局执行上下文
  • 函数执行上下文:每次调用函数时,都会为该函数创建一个新的执行上下文,每个函数都拥有自己的执行上下文,但是只有在函数被调用的时候才会被创建,一个程序中可以存在任意数量的函数执行上下文。每当一个新的执行上下文被创建,它都会按照特定的顺序执行一系列步骤
  • eval函数执行上下文:可以将字符串直接编译执行,运行在eval函数中的代码也有自己的执行上下文,但是一般不通过eval进行开发
eval("console.log('这是eval')");//"这是eval"
var str = function() {
  var b = 10;
  console.log(b);
}
eval("str()");//10

作用域

定义

  • JavaScript解释阶段便会确定作用域规则,因此作用域在函数定义时就已经确定了,而不是在函数调用时确定,是编写代码时定义的变量和函数的作用域
  • 作用域就是一个独立的区域,它可以让变量不会向外暴露出去。作用域最大的用处就是隔离变量。内层作用域可以访问外层作用域。一个作用域下可能包含若干个执行上下文
  • 作用域在定义时就确定,并且不会改变

词法环境

定义

  • 指相应代码块内标识符与变量值、函数值之间的关联关系的一种体现。词环境内部包含环境记录器和对外部环境的引用。环境记录器是存储变量和函数声明的实际位置,对外部环境的引用意味着可以访问父级词法环境

总结

  • javaScript属于解释型语言,JavaScript的执行分为解释和执行两个阶段
  • 解释阶段:
    • 词法分析
    • 语法分析
    • 作用域的规则确定
  • 执行阶段:
    • 创建执行上下文
    • 执行函数代码
    • 垃圾回收
  • JavaScript解释阶段便会确定作用域规则,因此作用域在函数定义时就已经确定了,而不是在函数调用时确定,但是执行上下文是函数执行之前创建的。执行上下文最明显的就是this的指向是执行时确定的。而作用域访问的变量是编写代码的结构确定的

-------------------------------------------------------------------------------2024.5.20每日一题