javascript的作用域链是如何形成的_变量查找遵循什么规则

发布时间 - 2025-12-29 00:00:00    点击率:
JavaScript的作用域链在函数定义时确定,由词法环境决定,变量查找沿定义时嵌套关系向上进行,未找到则抛ReferenceError;闭包依赖此静态链。

JavaScript 的作用域链是在函数定义时就确定的,它由函数创建时所处的词法环境(lexical environment)决定,不是在调用时动态生成的。变量查找严格遵循“词法作用域”规则:从当前执行上下文的作用域开始,沿着作用域链逐级向外查找,直到全局作用域;找不到则报 ReferenceError

作用域链的形成过程

每当一个函数被定义,JS 引擎会记录下它所在的词法环境(即外层作用域),这个引用被保存在函数的内部属性 [[Environment]] 中。函数执行时,会基于该属性构建作用域链:

  • 当前函数自己的词法环境(含形参、let/const 声明、function 声明)作为链首
  • 接着是外层函数的词法环境(如果存在)
  • 逐层向上,直到全局词法环境(浏览器中是 window,Node.js 中是 global

变量查找的具体规则

查找变量时,JS 引擎按以下顺序进行:

  • 先在当前作用域内搜索标识符(区分 varlet/constfunction 的声明提升与暂时性死区)
  • 若未找到,沿 [[Environment]] 指向的外层作用域继续查找
  • 全局作用域也找不到,则抛出 ReferenceError(注意:不是 undefined
  • 不跨函数体横向查找,只沿定义时嵌套关系向上查找(这就是“词法”而非“动态”的关键)

一个典型例子说明链的静态性

看这段代码:

function outer() {
  const x = 10;
  return function inner() {
    console.log(x); // 能访问到 outer 的 x
  };
}
const fn = outer();
fn(); // 输出 10

即使 outer 执行结束、其执行上下文被销毁,inner 仍能通过作用域链访问 x —— 因为 inner[[Environment]] 在定义时就绑定了 outer 的词法环境。这正是闭包的本质基础。

注意几个常见误区

  • withcatch 语句会临时插入作用域链节点,但已不推荐使用
  • eval 在非严格模式下可能修改作用域链,行为复杂且危险,应避免
  • 箭头函数没有自己的 thisarguments,也没有自己的作用域链顶层,它直接继承外层函数的词法环境
  • 模块作用域(import/export)也是词法作用域的一部分,位于全局作用域之上一层


# javascript  # java  # js  # node.js  # node  # 浏览器  # win  # 作用域 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何获取PHP WAP自助建站系统源码?  Laravel怎么使用Intervention Image库处理图片上传和缩放  Linux后台任务运行方法_nohup与&使用技巧【技巧】  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  如何快速搭建高效简练网站?  Python文本处理实践_日志清洗解析【指导】  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  简单实现Android文件上传  在Oracle关闭情况下如何修改spfile的参数  高防服务器租用首荐平台,企业级优惠套餐快速部署  Laravel Fortify是什么,和Jetstream有什么关系  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  JavaScript如何操作视频_媒体API怎么控制播放  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何在新浪SAE免费搭建个人博客?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Android自定义控件实现温度旋转按钮效果  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel安装步骤详细教程_Laravel环境搭建指南  清除minerd进程的简单方法  中山网站制作网页,中山新生登记系统登记流程?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  千库网官网入口推荐 千库网设计创意平台入口  ,怎么在广州志愿者网站注册?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何在IIS中新建站点并配置端口与IP地址?  Laravel如何为API生成Swagger或OpenAPI文档  如何快速启动建站代理加盟业务?  Laravel怎么判断请求类型_Laravel Request isMethod用法  html5的keygen标签为什么废弃_替代方案说明【解答】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  如何实现建站之星域名转发设置?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  JS弹性运动实现方法分析  html如何与html链接_实现多个HTML页面互相链接【互相】  如何在万网ECS上快速搭建专属网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  电商网站制作价格怎么算,网上拍卖流程以及规则?