新闻中心

执行上下文详解_j*ascript作用域链

2025-11-30
浏览次数:
返回列表
执行上下文是J*aScript代码运行时的环境,分为全局、函数和eval三种类型,每调用一个函数就会创建一个新的执行上下文并压入执行栈。其生命周期包含创建和执行两个阶段:创建阶段确定this、生成词法环境与变量环境;执行阶段进行变量赋值和代码执行。作用域链由词法环境构成,用于按定义位置从内向外查找变量,确保函数能访问外层作用域的变量,形成闭包机制。闭包使内部函数可持久访问外部函数的变量,即使外部函数已执行完毕,如counter示例中count被持续引用而未被销毁。理解执行上下文与作用域链有助于掌握变量查找机制和函数执行原理,提升代码逻辑清晰度与质量。

执行上下文详解_javascript作用域链

在 J*aScript 中,理解执行上下文和作用域链是掌握变量查找机制和函数执行原理的关键。每当 J*aScript 代码运行时,引擎会创建一个执行环境,这个环境就是“执行上下文”。而作用域链则是该上下文中用于查找变量的路径机制。

执行上下文是什么

执行上下文是 J*aScript 引擎用来管理代码执行的一种内部机制。它并不是代码本身,而是代码运行时所处的环境。每一段可执行代码(全局代码、函数代码、eval 代码)都会对应一个执行上下文。

执行上下文分为三种类型:

  • 全局执行上下文:代码首次运行时创建,只有一个。全局对象(浏览器中是 window)在此上下文中创建,this 指向全局对象。
  • 函数执行上下文:每次调用函数时都会创建一个新的执行上下文,函数之间相互独立。
  • eval 执行上下文:在 eval 函数中运行的代码会生成自己的执行上下文,通常不推荐使用。

J*aScript 是单线程语言,同一时间只能执行一个上下文,其他上下文会被放入执行栈(也叫调用栈)中排队。当前执行完毕后,控制权交还给上一层。

执行上下文的生命周期

每个执行上下文的创建和执行分为两个阶段:

1. 创建阶段
  • 确定 this 的值(this binding)
  • 创建词法环境(Lexical Environment),用于处理变量声明(let/const)和函数声明
  • 创建变量环境(Variable Environment),主要用于 var 声明

在这个阶段,变量和函数已经被注册,但尚未赋值(var 变量为 undefined,let/const 处于暂时性死区)。

2. 执行阶段
  • 逐行执行代码
  • 变量被赋值,函数被调用
  • 词法环境中的变量完成初始化

例如:

var a = 10;
function foo() {
  var b = 20;
  console.log(a); // 10
}
foo();

当 foo 被调用时,会创建新的函数执行上下文,进入创建阶段:this 绑定、变量环境记录 b,然后进入执行阶段赋值并输出 a。

作用域链与变量查找机制

作用域链是执行上下文的一部分,它是由一系列词法环境组成的链式结构,用于变量查找。它的核心原则是:从内向外逐层查找变量,直到全局上下文为止。

织梦绿色农业公司网站模板5.7 织梦绿色农业公司网站模板5.7

绿色农业公司网站模板源码采用织梦5.7 UTF编码制作,该源码附带栏目数据。安装说明:解压上传到空间,运行域名/install进行安装,安装好后到后台系统-数据备份还原 还原下数据,最新到系统-系统基本参数把网站名称什么的改为自己的即可。详细安装说明在压缩包,可自行查看。

织梦绿色农业公司网站模板5.7 0 查看详情 织梦绿色农业公司网站模板5.7

作用域链的形成基于函数定义时的位置,而不是调用位置(这就是词法作用域)。

举个例子:

var x = 'global';

function outer() {
  var y = 'outer';
  function inner() {
    var z = 'inner';
    console.log(x, y, z); // "global" "outer" "inner"
  }
  inner();
}
outer();

当 inner 函数执行时,其作用域链包含三个环境:

  • inner 自己的词法环境(有 z)
  • outer 的词法环境(有 y)
  • 全局词法环境(有 x)

变量查找按此顺序进行。如果某变量在当前环境找不到,就向上一级查找,直到全局环境。若仍未找到,则抛出 ReferenceError。

闭包与作用域链的关系

闭包是指函数能够访问其定义时所在作用域的变量,即使外部函数已经执行完毕。这正是作用域链的体现。

看下面的例子:

function outer() {
  var count = 0;
  return function inner() {
    count++;
    console.log(count);
  };
}
var counter = outer();
counter(); // 1
counter(); // 2

虽然 outer 已经执行结束,其执行上下文本应销毁,但由于 inner 函数引用了 outer 中的 count 变量,所以 outer 的词法环境仍然保留在内存中。inner 的作用域链保留了对 outer 环境的引用,从而实现了状态持久化。

基本上就这些。执行上下文决定了代码如何运行,作用域链决定了变量如何查找。理解它们有助于写出更清晰、不易出错的 J*aScript 代码,尤其是在处理嵌套函数和异步逻辑时。不复杂但容易忽略。

以上就是执行上下文详解_j*ascript作用域链的详细内容,更多请关注其它相关文章!


# 向外  # 七台河自媒体营销推广方法  # 浙江网站建设推广平台  # 茂名视频网站建设  # 新网站SEO目标  # 怎么做关键词排名视频  # seo优化流量工厂  # seo 关键词更改  # 石狮seo虾哥网络  # 通州网站建设制作  # 北滘网站开发推广  # 有何不同  # 如何用  # 表单  # 作用域链  # 链式  # 三种  # 则是  # 有哪些  # 创建一个  # 自己的  # 作用域  # win  #   # 浏览器  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 将JSON对象数组转置为键值对列表的实用指南  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  微信网页版登录教程_微信网页版登录入口在哪  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  J*a应用集成GitHub CLI与API认证指南  ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  随机参数递归函数的基准调用次数与时间复杂度探究  J*aScript Promise链中如何正确终止后续.then执行并处理错误  必由学官网首页入口 必由学教师网页版登录指南  C++如何解决segmentation fault_C++段错误调试与原因分析  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  Python多版本共存与虚拟环境管理深度指南  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  QQ网页版官方账号入口 QQ网页版网页版登录指南  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  汽水音乐在线版入口_汽水音乐网页播放手册  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  深入理解J*a链表中的IPosition接口与使用  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  yandex入口引擎手机版 yandex安卓版下载入口  深入理解Go语言中的指针类型:以*string为例  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  微信网页版官方入口直达 微信网页版网页版登录使用方法  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  Pandas DataFrame:高效添加条件计算列  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  实现分段式页面滚动导航:CSS与J*aScript教程 

搜索