新闻中心
如何理解作用域链_j*ascript中的作用域如何查找?
作用域链是函数定义时确定的词法作用域查找路径,从当前函数作用域逐级向上指向全局对象;变量读取时按此链由近及远查找,未找到则报ReferenceError;闭包即函数持有该链对父级变量的引用。

J*aScript 中的作用域链,本质是函数在定义时就确定的一条“词法作用域的查找路径”。它决定了变量和函数在执行时能访问到哪些数据——不是看函数在哪调用,而是看它在哪定义。
作用域链是怎么形成的?
每个函数在创建时,JS 引擎会为其绑定一个内部属性 [[Scopes]](可通过 DevTools 的 console.dir 查看),里面保存着它定义时所处的所有外层作用域的引用,从内到外依次排列。这条链的起点是当前函数自己的作用域(AO/VO),然后逐级向上连接外层函数的作用域,最终指向全局对象(如 window 或 globalThis)。
例如:
function outer() {const x = 10;
function inner() {
console.log(x); // 能访问到 outer 的 x
}
return inner;
}
const fn = outer();
fn(); // 输出 10 —— 尽管 outer 已执行完毕,inner 仍通过作用域链持有对 x 的引用
变量查找过程:从近到远,逐层向上
当代码中引用一个变量(比如 a),JS 引擎按以下顺序查找:
- 先查当前执行上下文的变量对象(当前函数的 AO,含形参、let/const 声明、函数声明)
- 没找到,就沿着 [[Scopes]] 链向上,查外层函数的 AO
- 继续向上,直到全局作用域
- 全程都找不到,就抛出 ReferenceError
注意:查找只发生在“读取变量值”时(即 RHS 查询);而赋值操作(LHS 查询)如果没找到,会在全局创建(非严格模式)或报错(严格模式)。
通吃客零食网整站 for Shopex
第一步】:将安装包中所有的文件夹和文件用ftp工具以二进制方式上传至服务器空间;(如果您不知如何设置ftp工具的二进制方式,可以查看:(http://www.shopex.cn/support/qa/setup.help.717.html)【第二步】:在浏览器中输入 http://您的商店域名/install 进行安装界面进行安装即可。【第二步】:登录后台,工具箱里恢复数据管理后台是url/sho
0
查看详情
闭包是作用域链的直接体现
所谓闭包,就是函数记住了并能访问自己定义时所在词法作用域的能力。这背后没有魔法,只是函数对象持有了对父级作用域链的引用。
- 即使外层函数已执行结束、执行上下文被销毁,只要内层函数还存在(比如被返回、被赋值给变量),它的作用域链里依然保留着对外层变量的访问权
- 这就是为什么 let/const 变量不会被回收——它们被闭包“活引用”着
- 过度使用闭包可能造成内存占用,但这是作用域链的自然结果,不是 bug
容易混淆的点:作用域链 ≠ 调用栈
调用栈反映的是“谁调用了谁”,是运行时的执行顺序;作用域链反映的是“谁定义在谁里面”,是写代码时就固定的词法嵌套关系。
- setTimeout 里的回调函数,作用域链取决于它定义的位置,不是 setTimeout 所在位置
- 箭头函数没有自己的 this,也没有自己的 arguments,但它有完整的作用域链——它沿用外层函数的作用域
- eval 和 with 会动态修改作用域链,所以性能差且不推荐使用
基本上就这些。理解作用域链的关键,是始终记住:J*aScript 是静态词法作用域语言,变量在哪里“出生”(定义),就决定了它能“认谁做爹”(能访问哪些外层变量)。
以上就是如何理解作用域链_j*ascript中的作用域如何查找?的详细内容,更多请关注其它相关文章!
# 可以使用
# 房产营销推广建议
# seo项目合伙人
# 免费信息推广发布网站
# 独立站seo优化排名
# 上城网站优化公司电话
# 阜阳抖音seo公司排名
# 开封抖音seo搜索推广
# 无极银联关键词排名含义
# 海安建设银行网站
# 药品营销是不是推广药品
# 有什么区别
# 第二步
# 如何解决
# 时就
# javascript
# 中文网
# 吃客
# 的是
# 回调
# 自己的
# 为什么
# 排列
# 内存占用
# 作用域
# win
# 栈
# 回调函数
# js
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
QQ网页版官方账号入口 QQ网页版网页版登录指南
利用5118提升短视频内容效果_5118短视频关键词优化方法
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
Python大型XML文件高效流式解析教程
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
Archive of Our Own官网直达 AO3最新可用地址一览
必由学官网快捷入口 必由学网页版在线学习平台
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
抖音极速版最新版本 抖音极速版官方下载地址
c++项目目录结构应该如何组织_c++工程化项目结构规范
电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】
红果短剧网页版官网入口 官方最新网址发布
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
Animex动漫社网入口地址 Animex动漫社网正版在线入口
Win10双系统截图高效法 截屏快捷键速记【技巧】
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
Typer应用中动态命令行参数的解析与处理
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践
J*aScript中在Map循环中检测并处理空数组元素
微信商城在哪里打开【步骤】
Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
Golang如何测试channel通信行为_Golang channel通信测试与分析方法
KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
如何使 Jest 模拟函数默认抛出错误以提高测试效率
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
如何使用 Excel 发布器与 Power BI 分享 Excel 洞察
狙击外星人小游戏开始_狙击外星人小游戏立即开始
葱吃多了会怎样 葱吃多了会伤胃吗
菜鸟取件码是什么怎么查 最全查询渠道汇总
淘宝支付提示失败如何解决 淘宝支付流程优化方法
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
12306几点到几点不能订票? | 官方最新系统维护时间全解析
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
React Router 嵌套组件中 URL 重定向问题的解决方案
PostgreSQL海量数据高效导入策略:Python与Django实践指南
如何提高微信支付的安全性_微信支付安全防护与设置建议
Tailwind CSS line-clamp 布局问题解析与修复指南
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口


2025-12-14
浏览次数:次
返回列表