javascript执行上下文详解

2023-12-09前端开发
20

JavaScript 执行上下文详解

JavaScript(以下简称 JS)是一种运行在浏览器中的编程语言,它常常被用来实现交互性和动画效果。理解 JavaScript 的执行上下文对于掌握 JS 编程至关重要,这篇文章将为你详细讲解 JS 执行上下文的工作原理及其相关的知识点。

JS 执行上下文

JS 执行上下文是在代码执行时,JavaScript 引擎所创建的一个内部数据结构,用于存储关于代码执行的所有信息。每当一个新的执行上下文被创建时,JS 引擎会对当前上下文进行压栈,即将其推到调用栈顶部。

执行上下文三要素

每个执行上下文由三个关键要素组成:

  1. 变量环境(Variable Environment)- 存储在当前执行上下文中声明的变量,同时也包含了函数声明等信息;
  2. 词法环境(Lexical Environment)- 保存了当前执行上下文中声明的所有符号(标识符)和它们对应的值(变量、函数)的映射。在函数的执行上下文中,它还记录了函数声明时的词法环境;
  3. this 值(This Binding) - 在执行上下文的创建阶段,JS 引擎会确定 this 的值,并将其绑定到执行上下文中。

执行上下文的类型

在 JavaScript 中,有三种类型的执行上下文:

  1. 全局执行上下文,它是 JS 引擎在代码执行的开头创建的第一个执行上下文,它的作用域为全局作用域。
  2. 函数执行上下文,每当函数被调用时,都会创建一个新的函数执行上下文,它的作用域为函数作用域。
  3. Eval 执行上下文,由 eval() 函数所创建,它的作用域依赖于调用 eval() 函数代码所处的执行上下文。

执行上下文创建阶段

当一个新的执行上下文被创建时,它将经历两个阶段的过程:创建阶段和执行阶段。

创建阶段

  1. 变量对象的创建: 变量对象(Variable Object)是一个关键的元素,用于在代码执行前存储变量、函数定义等信息。针对全局执行上下文,它是全局变量对象,包含了全局变量、函数,以及用let和const定义的变量。针对函数执行上下文,它是活动对象(Active Object),除了包含函数的参数和局部变量,还包含函数声明和变量声明。
  2. 词法环境的创建: 词法环境是一种规范类型,用于管理符号和变量之间的关系,它会在代码执行之前被创建,并在执行期间维护。对于全局执行上下文,词法环境通常与全局变量对象相同;针对函数执行上下文,它会创建一个函数环境,其中包括当前执行上下文内声明的变量和函数。
  3. 绑定 this 值:在创建阶段,JS 引擎还会确定 this 的值,并将其绑定到执行上下文中。

执行阶段

当执行上下文创建完成后,JS 引擎会开始执行代码。JS代码可以定义变量、函数、逻辑判断和控制流,这些操作都会在执行阶段内完成。

示例说明

接下来,我们通过几个示例的说明来加深对执行上下文的理解。

示例1: 全局执行上下文

var x = 'hello ';
console.log(x + y + z);
var y = 'world';

执行上下文的创建过程如下:

  1. 变量环境(Global Environment)被创建并压入调用栈;
  2. 全局变量 x 被创建并分配内存空间;
  3. console 对象及其方法被创建并分配内存空间;
  4. 代码执行顺序到达第二行,JS 引擎尝试打印 x、y 和 z 三个变量的值,由于此时 y 和 z 还未声明,所以它们的值为 undefined;
  5. 变量 y 被创建并分配内存空间,此时它的值为 undefined;
  6. 变量 z 被创建并分配内存空间,此时它的值为 undefined;
  7. 执行上下文被销毁并弹出调用栈。

示例2:函数执行上下文

function foo() {
  var x = 'foo';
  function bar() {
    var y = 'bar';
  }
  bar();
}
foo();

执行上下文的创建过程如下:

  1. 变量环境(Global Environment)被创建并推入调用栈;
  2. 函数 foo() 被创建,并分配内存空间;
  3. 函数 bar() 被创建,并分配内存空间;
  4. 创建 foo() 的执行上下文;
  5. 创建 bar() 的执行上下文;
  6. 把执行控制交给 bar();
  7. bar() 执行完成并从调用栈中弹出,控制权回到 foo() 执行;
  8. foo() 执行完毕并从调用栈中弹出,控制权回到全局执行上下文。

总结

学习 JavaScript 的执行上下文是理解 JavaScript 引擎如何执行代码的关键所在。通过了解它的生命周期、结构和类型,我们可以更好地编写 JavaScript 代码,并避免一些常见的错误。希望本文对您有所帮助!

The End

相关推荐

layui实现图片上传成功后回显点击放大图片功能
layui实现图片上传成功后回显点击放大图片功能,html代码部分: !-- html代码--div class="layui-form-item" label class="layui-form-label"上传图片/label div class="layui-input-block" button type="button" class="layui-btn" id="license-auth-letter-...
2025-09-06 前端开发
202

Layui实现数据表格中鼠标悬停图片放大离开时恢复原图
Layui实现数据表格中鼠标悬停图片放大离开时恢复原图的效果,最终效果如下图所示: 实现代码如下,在done函数中调用hoverOpenImg方法 var tableIns = window.demoTable = table .render({ elem : '#idTest', id : 'idTest', url : '/postData', //width : 150...
2025-09-04 前端开发
112

layui点击文本输入框调起弹出选择框并选择内容的两种方法参考
我们在用到layui时候,需要点击文本输入框调起弹出选择框并选择内容,这个要怎么操作呢?以下两种方法可以参考: 1、点击名称,弹出信息弹框,选择表格中的某一行,实现效果如下: html页面代码 !--计量器具弹出层-- div id="equipment" lay-filter="equipmen...
2025-09-02 前端开发
167

网站部署https后百度地图不显示问题
https的网站如果引用百度地图,会出现加载不了的问题,这是因为涉及到跨域问题,网站是https的,但是引用百度地图的是http的,这个要怎么操作呢? 比如我引用的地址:http://api.map.baidu.com/api?v=2.0ak=AK显示 后来看了一下,少了一个s=1字段,加一下s=1...
2025-07-28 前端开发
139

微信小程序实现点击复制功能和手机拨打电话功能
做小程序项目的时候,客户提了一个功能需求优化,就是长按文字需要复制全部内容,因为有的手机支持全选复制,有的手机不支持全选复制。 通过设置系统剪贴板的内容和获取系统剪贴板的内容实现复制功能 html相关代码: van-field value="{{form.contactPhone}}"...
2025-07-02 前端开发
78

js拖拽排序插件Sortable.js如何使用
由于项目功能需要,要实现对table中的行实现拖拽排序功能,找来找去发现Sortable.js能很好的满足这个需求,而且它还是开源的,于是乎就开始学习使用Sortable.js 特点 轻量级但功能强大 移动列表项时有动画 支持触屏设备和大多数浏览器(IE9及以下除外) 支持...
2025-06-12 前端开发
161