当前位置: 首页 > news >正文

Javascript 中作用域的理解?

一、作用域的类型

1. 全局作用域(公司大门外)
  • 范围:整个 JavaScript 文件
  • 变量:像贴在公告栏上的信息,所有人可见
  • 例子
    const companyName = "阿里"; // 全局变量,任何地方都能访问
    function showCompany() {console.log(companyName); // 能访问
    }
    
2. 函数作用域(独立办公室)
  • 范围:函数内部
  • 变量:像办公室抽屉里的文件,只有内部员工能访问
  • 例子
    function departmentA() {const secret = "部门A的密码"; // 函数作用域变量console.log(secret); // 能访问
    }
    departmentA();
    console.log(secret); // 报错!外部无法访问
    
3. 块级作用域(会议室,ES6 新增)
  • 范围{} 内部(如 ifforwhile
  • 变量:用 letconst 声明,像会议纪要只能在会议室使用
  • 例子
    if (true) {const meetingNote = "重要内容"; // 块级作用域console.log(meetingNote); // 能访问
    }
    console.log(meetingNote); // 报错!外部无法访问
    

二、作用域链:权限的传递规则

1. 规则:像快递员送包裹
  • 当前作用域找不到变量时,会一层层向上级作用域查找
  • 直到全局作用域,找不到就报错
2. 代码示例
const globalVar = "全局"; // 全局作用域function outer() {const outerVar = "外层"; // outer 函数作用域function inner() {const innerVar = "内层"; // inner 函数作用域console.log(innerVar); // 自己抽屉找到 → "内层"console.log(outerVar); // 上级办公室找到 → "外层"console.log(globalVar); // 公告栏找到 → "全局"}inner();
}outer();

三、关键细节:避免踩坑

1. var 的坑(没有块级作用域)
for (var i = 0; i < 3; i++) {setTimeout(() => console.log(i), 100); // 输出 3,3,3
}
// 原因:var 声明的 i 属于全局作用域// 正确写法(用 let 块级作用域):
for (let i = 0; i < 3; i++) {setTimeout(() => console.log(i), 100); // 输出 0,1,2
}
2. 变量提升(先上车后补票)
  • var 声明的变量会提升到作用域顶部,但值为 undefined
  • letconst 不会完全提升(存在暂时性死区)
    console.log(a); // undefined(var 变量提升)
    var a = 10;console.log(b); // 报错(let 不会提升)
    let b = 20;
    

四、作用域的重要性

  1. 避免命名冲突:不同作用域的同名变量互不影响
  2. 数据保护:函数内部的变量外部无法直接修改
  3. 管理内存:作用域结束后,内部变量可被垃圾回收

总结比喻

  • 全局作用域:公司公告栏(随便看)
  • 函数作用域:部门保险箱(需权限)
  • 块级作用域:会议室白板(会后擦除)
  • 作用域链:快递员送包裹(层层向上找地址)
http://www.dtcms.com/a/163908.html

相关文章:

  • 【AI提示词】第一性原理
  • k8s学习笔记
  • 2025年KBS新算法 SCI1区TOP:长颖燕麦优化算法AOO,深度解析+性能实测
  • 【计算机视觉】深度解析MediaPipe:谷歌跨平台多媒体机器学习框架实战指南
  • 海外App数据隐私架构实战:构建GDPR、CCPA合规的全栈解决方案
  • 打造美观 API 文档:Spring Boot + Swagger 实战指南
  • 案例速成GO+Socket,个人笔记
  • Linux 服务管理两种方式service和systemctl
  • 《数学物理方程》——第一章 引入与基本概念
  • AGILE:开启LLM Agent强化学习的创新框架
  • 【dify—3】拉取镜像、本地访问dify
  • AimRT 从零到一:官方示例精讲 —— 六、pb_chn示例.md
  • 香港科技大学广州|可持续能源与环境学域博士招生宣讲会—四川大学专场
  • 【Fifty Project - D20】
  • 【自然语言处理与大模型】LangChain大模型应用框架入门②
  • 8分钟快速掌握Markdiwn
  • 阿里Qwen3 8款模型全面开源,免费商用,成本仅为 DeepSeek-R1 的三分之一
  • AIGC(生成式AI)技术全景图:从文本到图像的革命
  • Unity PBR基础知识
  • VS Code 的新AI Agent 模式绝了
  • OpenGL学习笔记(PBR)
  • 在Spark中通过jps命令看到的进程名,是哪个命令产生有什么作用
  • 【图片识别成表格】批量图片识别成excel表格,批量识别图片区域文字保存到excel表格,基于WPF和腾讯OCR的识别方案
  • 使用Forge API制作《我的世界》Java版MOD的一般步骤
  • 51LA使用方法与悟空统计,网站数据分析的双重选择
  • 证券项目场景题深度解析
  • 物联网平台厂商有哪些?2025物联网平台推荐?国内有哪些比较好的物联网平台?
  • Game Booster汉化版:一键优化,畅享游戏
  • STM32 SPI通信协议
  • Android Studio 中实现方法和参数显示一行