【JavaScript】作用域
作用域是指在程序中定义变量的区域,决定了这些变量在哪里可以被访问和使用。JavaScript 中的作用域有全局作用域、函数作用域和块级作用域。
1. 什么是作用域?
作用域是代码中定义变量的区域,它决定了变量的可见性和生命周期。作用域规定了在程序中哪些部分可以访问某个变量,以及变量在哪些地方是可用的。
作用域最大的作用就是隔离变量。
2. 全局作用域和函数作用域
- 全局作用域:全局作用域是指在代码中任何地方都可以访问的作用域。在全局作用域中声明的变量拥有全局作用域,可以被代码中的任何地方访问。
let globalVar = 10;function test() {console.log(globalVar); // 可以访问全局作用域中的变量
}
- 最外层函数和在最外层函数外面定义的变量拥有全局作用域
- 所有未定义直接赋值的变量自动声明为拥有全局作用域
- window 对象的所有属性拥有全局作用域
全局作用域很大的弊端就是全局污染。所以这就是为什么 jQuery 等库的源码,都会放在 立即执行函数 中。
- 函数作用域:函数作用域是指在函数内部声明的变量只能在该函数内部访问的作用域。函数外部无法访问函数内部声明的变量。
function test() {let localVar = 20;console.log(localVar); // 可以访问函数作用域中的变量
}console.log(localVar); // 报错,无法访问函数作用域中的变量
值得注意的是:块语句(大括号" {) "中间的语句) ,如if和switch条件语句或for和while循环语句,不像函数,它们不会创建一个新的作用域。在块语句中定义的变量将保留在它们已经存在的作用域中。
3. 块级作用域
在 ES6 中引入了块级作用域,使用 let 和 const 关键字声明的变量具有块级作用域。块级作用域指的是在代码块(如 if、for、while、{} 等)内部声明的变量只在该代码块内部可见。
if (true) {let blockVar = 30;console.log(blockVar); // 可以访问块级作用域中的变量
}console.log(blockVar); // 报错,无法访问块级作用域中的变量
作用域链
作用域链是一种链式结构,用于查找和解析变量标识符。
1. 什么是自由变量?
自由变量是指在当前函数作用域中未声明但被引用(使用)的变量。
当 JavaScript 引擎在当前作用域中找不到某个变量时,它会沿着作用域链向上查找,直到找到该变量为止。如果在全局作用域中也找不到该变量,那么该变量就是一个自由变量。
let globalVar = 'Global Variable';function outerFunction() {let outerVar = 'Outer Variable';function innerFunction() {console.log(outerVar); // Outer Variable 是一个自由变量console.log(globalVar); // globalVar 是一个自由变量}innerFunction();
}outerFunction();
在上面的例子中,innerFunction 内部引用了 outerVar 和 globalVar,但在该函数作用域中都没有声明这两个变量,因此它们都是自由变量。
2. 什么是作用域链?
作用域链是 JavaScript 中一种动态的数据结构,用于解析标识符引用。当 JavaScript 引擎遇到变量引用时,它会沿着作用域链向上查找,直到找到对应的变量或者到达全局作用域为止。作用域链是由当前执行环境的变量对象和所有外部环境的变量对象组成的链式结构。
3. 关于自由变量的取值
当 JavaScript 引擎在当前作用域中找不到某个变量时,它会沿着作用域链向上查找。如果在作用域链的某个环境中找到了对应的变量,则使用该变量的值;如果在作用域链的顶端(全局作用域)仍然找不到对应的变量,则会抛出 ReferenceError 错误。
向上级(或者说父级)找这种说法是不太准确的。
let x = 10
function fn() {console.log(x)
}
function show(f) {let x = 20;(function () {f() // 10 而不是 20})()
}
show(fn)
取自由变量的值要在创建 fn 的函数那个作用域中去取,无论 fn 在哪里调用。
这就是所谓的“静态作用域”。作用域中的值在函数创建的时候,就已经被存储了,是静态的。
作用域与执行上下文
JavaScript属于解释性语言,JavaScript 的执行分为两个阶段:解释和执行。
解释阶段:
- 词法分析
- 语法分析
- 作用域规则确定
执行阶段:
- 创建执行上下文
- 执行函数代码
- 垃圾回收
执行上下文在运行时确定,随时可能改变,作用域在定义时就确定,并且不会改变。
相关文章:
【JavaScript】作用域
作用域是指在程序中定义变量的区域,决定了这些变量在哪里可以被访问和使用。JavaScript 中的作用域有全局作用域、函数作用域和块级作用域。 1. 什么是作用域? 作用域是代码中定义变量的区域,它决定了变量的可见性和生命周期。作用域规定了…...
C++程序设计教案
文章目录: 一:软件安装环境 第一种:vc2012 第二种:Dev-C 第三种:小熊猫C 二:语法基础 1.相关 1.1 注释 1.2 换行符 1.3 规范 1.4 关键字 1.5 ASCll码表 1.6 转义字符 2.基本框架 2.1 第一种&…...
修改Ubuntu远程登录欢迎提示信息
无论何时登录公司的某些生产系统,你都会看到一些登录消息、警告或关于你已登录服务器的信息,如下所示。 修改方式 1.打开ubuntu终端,进入到/etc/update-motd.d目录下面 可以发现目录中的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件…...
暗区突围pc端下载教程 暗区突围pc端怎么下载
暗区突围pc端下载教程 暗区突围pc端怎么下载 《暗区突围》是一款刺激的第一人称射击游戏。目前pc版本要上线了,即将在5月正式上线。在这款游戏里,我们会在随机的时间、地点,拿着不一定的装备,跟其他玩家拼个高低,还需…...
大数据技术原理与技术简答
1、HDFS中名称节点的启动过程 名称节点在启动时,会将FsImage 的内容加载到内存当中,此时fsimage是上上次关机时的状态。然后执行 EditLog 文件中的各项操作,使内存中的元数据保持最新。接着创建一个新的FsImage 文件和一个空的 Editlog 文件…...
Mybatis的简介和下载安装
什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的…...
大历史下的 tcp:一个松弛的传输协议
如果 tcp 是一个相对松弛的协议,会发生什么。 所谓松弛感,意思是它允许 “漏洞”,允许可靠传输的不封闭,大致就是:“不求 100% 可靠,只要 90%(或多或少) 可靠,另外 10% 的错误可检测到” or “…...
加州大学欧文分校英语中级语法专项课程03:Tricky English Grammar 学习笔记
Tricky English Grammar Course Certificate Course Intro 本文是学习 https://www.coursera.org/learn/tricky-english-grammar?specializationintermediate-grammar 这门课的学习笔记 文章目录 Tricky English GrammarWeek 01: Nouns, Articles, and QuantifiersLearning …...
AI项目二十一:视频动态手势识别
若该文为原创文章,转载请注明原文出处。 一、简介 人工智能的发展日新月异,也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式,在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是,当操作者做出…...
浅拷贝与深拷贝面试问题及回答
1. 浅拷贝和深拷贝的区别是什么? 答: 浅拷贝(Shallow Copy)仅复制对象的引用而不复制引用的对象本身,因此原始对象和拷贝对象会引用同一个对象。而深拷贝(Deep Copy)则是对对象内部的所有元素进…...
推荐算法顶会论文合集
SIGIR SIGIR 2022 | 推荐系统相关论文分类整理:8.74 https://mp.weixin.qq.com/s/vH0qJ-jGHL7s5wSn7Oy_Nw SIGIR2021推荐系统论文集锦 https://mp.weixin.qq.com/s/N7V_9iqLmVI9_W65IQpOtg SIGIR2020推荐系统论文聚焦: https://mp.weixin.qq.com/s…...
组合模式(Composite)——结构型模式
组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示, 在应用中使用组合模式才有价值。 例如一个场景…...
利用大模型提升个性化推荐的异构知识融合方法
在推荐系统中,分析和挖掘用户行为是至关重要的,尤其是在美团外卖这样的平台上,用户行为表现出多样性,包括不同的行为主体(如商家和产品)、内容(如曝光、点击和订单)和场景࿰…...
Dockerfile 里 ENTRYPOINT 和 CMD 的区别
ENTRYPOINT 和 CMD 的区别: 在 Dockerfile 中同时设计 CMD 和 ENTRYPOINT 是为了提供更灵活的容器启动方式。ENTRYPOINT 定义了容器启动时要执行的命令,而 CMD 则提供了默认参数。通过结合使用这两个指令,可以在启动容器时灵活地指定额外的参…...
腾讯的EdgeONE是什么?
腾讯的EdgeONE是一项边缘计算解决方案,具有一系列优势: 边缘计算能力强大:EdgeONE利用腾讯云在全球范围内的分布式基础设施,提供强大的边缘计算能力,可以实现低延迟和高可用性的服务。 智能化和自动化:Edg…...
SVM直观理解
https://tangshusen.me/2018/10/27/SVM/ https://www.bilibili.com/video/BV16T4y1y7qj/?spm_id_from333.337.search-card.all.click&vd_source8272bd48fee17396a4a1746c256ab0ae SVM是什么? 先来看看维基百科上对SVM的定义: 支持向量机(英语:su…...
Nessus 部署实验
一、下载安装https://www.tenable.com/downloads/nessus 安装好之后,Nessus会自动打开浏览器,进入到初始化选择安装界面,这里我们要选择 Managed Scanner 点击继续,下一步选择Tenable.sc 点击继续,设置用户名和密码 等…...
基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…...
Java性能优化(五)-多线程调优-Lock同步锁的优化
作者主页: 🔗进朱者赤的博客 精选专栏:🔗经典算法 作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名) ❤️觉得文章还…...
WPF (Windows Presentation Foundation) 中 Attribute(属性)和 Property(属性)
在 WPF (Windows Presentation Foundation) 中,Attribute(属性)和 Property(属性)是两个相关但不同的概念。 Attribute(属性)是一种元数据,用于给类型、成员或其他代码元素添加附加…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
