javascript的作用域链是如何形成的_变量查找遵循什么规则
发布时间 - 2025-12-29 00:00:00 点击率:次JavaScript的作用域链在函数定义时确定,由词法环境决定,变量查找沿定义时嵌套关系向上进行,未找到则抛ReferenceError;闭包依赖此静态链。
JavaScript 的作用域链是在函数定义时就确定的,它由函数创建时所处的词法环境(lexical environment)决定,不是在调用时动态生成的。变量查找严格遵循“词法作用域”规则:从当前执行上下文的作用域开始,沿着作用域链逐级向外查找,直到全局作用域;找不到则报 ReferenceError。
作用域链的形成过程
每当一个函数被定义,JS 引擎会记录下它所在的词法环境(即外层作用域),这个引用被保存在函数的内部属性 [[Environment]] 中。函数执行时,会基于该属性构建作用域链:
- 当前函数自己的词法环境(含形参、
let/const声明、function声明)作为链首 - 接着是外层函数的词法环境(如果存在)
- 逐层向上,直到全局词法环境(浏览器中是
window,Node.js 中是global)
变量查找的具体规则
查找变量时,JS 引擎按以下顺序进行:
- 先在当前作用域内搜索标识符(区分
var、let/const和function的声明提升与暂时性死区) - 若未找到,沿
[[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 的词法环境。这正是闭包的本质基础。
注意几个常见误区
-
with和catch语句会临时插入作用域链节点,但已不推荐使用 -
eval在非严格模式下可能修改作用域链,行为复杂且危险,应避免 - 箭头函数没有自己的
this、arguments,也没有自己的作用域链顶层,它直接继承外层函数的词法环境 - 模块作用域(
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配置推荐
电商网站制作价格怎么算,网上拍卖流程以及规则?


)也是词法作用域的一部分,位于全局作用域之上一层