新闻中心

如何理解作用域链_j*ascript中的作用域如何查找?

2025-12-14
浏览次数:
返回列表
作用域链是函数定义时确定的词法作用域查找路径,从当前函数作用域逐级向上指向全局对象;变量读取时按此链由近及远查找,未找到则报ReferenceError;闭包即函数持有该链对父级变量的引用。

如何理解作用域链_javascript中的作用域如何查找?

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 通吃客零食网整站 for Shopex

第一步】:将安装包中所有的文件夹和文件用ftp工具以二进制方式上传至服务器空间;(如果您不知如何设置ftp工具的二进制方式,可以查看:(http://www.shopex.cn/support/qa/setup.help.717.html)【第二步】:在浏览器中输入 http://您的商店域名/install 进行安装界面进行安装即可。【第二步】:登录后台,工具箱里恢复数据管理后台是url/sho

通吃客零食网整站 for Shopex 0 查看详情 通吃客零食网整站 for Shopex

闭包是作用域链的直接体现

所谓闭包,就是函数记住了并能访问自己定义时所在词法作用域的能力。这背后没有魔法,只是函数对象持有了对父级作用域链的引用。

  • 即使外层函数已执行结束、执行上下文被销毁,只要内层函数还存在(比如被返回、被赋值给变量),它的作用域链里依然保留着对外层变量的访问权
  • 这就是为什么 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邮箱网页入口 

搜索