22-作用域链的理解

news2024/11/17 0:20:51

文章目录

  • 作用域
  • 全局作用域
  • 函数作用域
  • 块级作用域
  • 二、词法作用域
  • 三、作用域链


作用域

🍿🍿🍿作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合

作用域决定了代码块中变量和其他资源的可见性

function demo(){
	let variable = "变量"}
demo();//要先执行这个函数,否则根本不知道里面是啥
console.log(variable)//访问不到 不可见

我们一般将作用域分成:

  • 我们一般将作用域分成:
  • 全局作用域
  • 函数作用域
  • 块级作用域

全局作用域

🧂🧂🧂任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问

//全局变量
var greeting = '全局变量'
function greet(){
	console.log(greeting)
}
greet()

函数作用域

🍕🍔🍕函数作用域也叫局部作用域,如果一个变量是在函数内部声明的它就在一个函数作用域下面。这些变量只能在函数内部访问,不能在函数以外去访问

function greet() {
  var greeting = 'Hello World!';
  console.log(greeting);
}
// 打印 'Hello World!'
greet();
// 报错: Uncaught ReferenceError: greeting is not defined
console.log(greeting);

可见上述代码中在函数内部声明的变量或函数,在函数外部是无法访问的,这说明在函数内部定义的变量或者方法只是函数作用域

块级作用域

ES6引入了let和const关键字,和var关键字不同,在大括号中使用let和const声明的变量存在于块级作用域中。在大括号之外不能访问这些变量

{
  // 块级作用域中的变量
  let greeting = 'Hello World!';
  var lang = 'English';
  console.log(greeting); // Prints 'Hello World!'
}
// 变量 'English'
console.log(lang);
// 报错:Uncaught ReferenceError: greeting is not defined
console.log(greeting);

二、词法作用域

🍗词法作用域,又叫静态作用域,变量被创建时就确定好了,而非执行阶段确定的。也就是说我们写好代码时它的作用域就确定了,JavaScript 遵循的就是词法作用域

var a = 2;
function foo(){
	console.log(a)
}
function bar(){
	var a = 1;
	foo();
}
bar()

由于JavaScript遵循词法作用域,相同层级的 foo 和 bar 就没有办法访问到彼此块作用域中的变量,所以输出2

三、作用域链

🍚🍚🍚当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域

如果在全局作用域里仍然找不到该变量,它就会在全局范围内隐式声明该变量(非严格模式下)或是直接报错

把作用域比喻成一个建筑,这份建筑代表程序中的嵌套作用域链,第一层代表当前的执行作用域,顶层代表全局作用域

在这里插入图片描述
变量的引用会顺着当前楼层进行查找,如果找不到,则会往上一层找,一旦到达顶层,查找的过程都会停止

var sex = '男';
function person(){
	var name = '李四';
	function student(){
		var age = 18;
		console.log(name);
		console.log(sex);
	}
	student();
	console.log(age);
}
person();

分析:

  • student 函数内部属于最内层作用域,找不到 name,向上一层作用域 person函数内部找,找到了输出“”
  • student内部输出 sex时找不到,向上一层作用域 person函数找,还找不到继续向上一层找,即全局作用域,找到输出
  • 在 person 函数内部输出 age 时找不到,向上一层作用域找,即全局作用域,还是找不到则 报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/682552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【案例31】数据源密码保存不上

问题现象 客户反馈在启动BIP高级版时,Bip 2207启动异常。在相关的启动日志中排查发现,报数据源连接异常的错误。排查发现BIP高级版的数据源不通。发现密码字段为空导致。 问题分析 添加了正确的密码,测试通过保存。再次重启。发现还是报数据…

如何支持研发对CSDN个性化推荐系统重构

目录 大地图工具构建数据治理保持发布重视测试小结 一个以内容服务为主的软件,它的推荐系统在数据侧对软件产生着举足轻重的作用。数据的三个方面决定了这个内容软件的档次。 数据的质量好坏数据和用户需求的相关性好坏数据的层次体系好坏 通常,我们说…

40 # npm 的使用

npm 3n: nrm:node 中源管理工具nvm:node 中的版本管理工具npm:node 的包管理器,管理的都是 node 的模块 第三方模块 分两种: 全局模块:只能在命令行中使用,任何路径都可以本地模…

前端高频JS面试题(附答案+视频讲解)

高频前端js面试题总结 对应的视频讲解位置 2023前端高频面试题-JS高频面试题(上)_哔哩哔哩_bilibili 目录 1. var let const 的区别? 2. javascript 有哪些基础数据类型? 3. null和undefined区别 4. 与 的区别?…

二十三种设计模式第十二篇--组合模式

组合模式是一种结构型设计模式,它允许将对象组合成树形结构来表示整体-部分的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 在组合模式中,有两种类型的对象:叶子对象和组合对象。叶子对象表示树结构中的叶子节点&…

为什么需要建设海绵城市?

海绵城市,是新一代城市雨洪管理概念,是指城市在适应环境变化和应对雨水带来的自然灾害等方面具有良好的“弹性”,也可称之为“水弹性城市”。其本质上是一种生态化的城市发展模式,其核心是将城市建设与生态环境保护相结合。 为什么…

二.《UE4奥丁》解密哈希ID

哈希表概念 1.相信大家经常在UE4或者UE5游戏逆向中遇到下面的代码段 $ > > 41:8B42 0C > mov eax,dword ptr ds:[r10C] > $4 > 3B05 AE589B04 > cmp eax,dword ptr ds:[7FF7B68B74F4] …

DeFi(去中心化金融),定义金融服务的未来

在数字化时代,区块链技术的发展引领了金融服务的全新变革。去中心化金融(DeFi)作为区块链技术的重要应用之一,正在重新定义传统金融服务的未来。本文将探讨DeFi的概念、优势以及对金融服务的影响,并展望其在未来的发展…

Linux上配置安装Nginx

Linux上安装配置Nginx 前言安装参考 前言 在前文中介绍了Nginx:Nginx入门 现在我们来试着在服务器上安装以下Nginx,以下操作使用的版本为1.20.0 下载地址为:Nginx官网下载地址 安装 先把包丢上去,我这里使用的是XFtp连接的服…

【Spring】— Spring MVC简单数据绑定(二)

接上文:【Spring】— Spring MVC简单数据绑定(一) 目录 2.3绑定POJO类型 2.3绑定POJO类型 在使用简单数据类型绑定时,可以很容易地根据具体需求来定义方法中的形参类型和个数,然而在实际应用中,客户端请求…

java学习记录之MySql二

1 mysql回顾 1.1 DDL 数据定义语言:结构  数据库database create database 数据库名称 character set 字符集 [collate 比较]; drop database 数据库名称; alter database 数据库名称 character set 字符集 …;  表 create table 表名(字段描述 , … ); 字段描述…

优雅地在高版本Android将文件保存到磁盘

Android对于文件存储的限制正在日趋严格。事实上,从Android 11(Android R)开始,那些传统的文件保存和读取方式统统失效了。 而高版本Android中存/取文件操作,百度到的内容是可行的,但是非常麻烦&#xff0c…

AIGC时代,基于云原生 MLOps 构建属于你的大模型(下)

为了满足企业在数字化转型过程中对更新迭代生产力工具的需求,灵雀云近日推出了Alauda MLOps 解决方案,帮助企业快速落地AI技术、实现智能化应用和服务。 AIGC大模型已成为企业创新引擎 随着ChatGPT的爆火,越来越多的人考虑使用AI来提升我们日…

python机器学习——回归模型评估方法 回归算法(线性回归、L2岭回归)

目录 回归模型评价方法【回归】线性回归模型1.线性模型2.线性回归3.损失函数(误差大小)4.解决方法1) 最小二乘法之正规方程2) 最小二乘法之梯度下降 5.代码实现5.模型保存与加载6.特点 实例:波士顿房价【回归】带有L2正则化的岭回归 回归模型…

C++初阶之类和对象(上)

类和对象(上) 1、面向过程和面向对象初步认识2、类的引入3、类的定义4、类的访问限定符及封装4.1 访问限定符4.2 封装 5、类的作用域6、类的实例化7、类对象模型7.1 如何计算类对象的大小 8.this指针8.1 this指针的引出8.2 this指针的特性8.3. C语言和C实…

Python开发工具PyCharm 2023.1发布,这些新功能都值得期待!

PyCharm 2023.1 现已正式发布!今年的第一个主要版本带来了对远程Jupyter Notebook的支持、对新UI的增强、改进的泛型类型推断等。 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0…

SpringBoot 使用 Testcontainers 进行容器化集成测试

SpringBoot 使用 Testcontainers 进行容器化集成测试 容器化集成测试是测试应用程序与其依赖项之间的集成,其中依赖项以容器的形式运行。SpringBoot提供了Testcontainers来测试应用程序与依赖项之间的集成,本文将介绍如何使用Testcontainers进行容器化集…

详细解说一次性低代码和持续化低代码的关键区别在哪里

为什么很多开发团队吐槽低代码开发平台,其中大致归结了几个方面的原因: 1、使用过后会降低对技术的依赖度,工具人的倾向更加严重 2、目前大部分的低代码都是一次性的低代码,仅仅是在第一次构建模型的时候,可以生成一…

CDC介绍

CDC介绍 1 CDC Change Data Capture:定义了一种场景,即识别并捕获数据库表中数据的变更,并交付给下游进一步处理。CDC是对针对行级数据记录的。其中数据的变更信息,即 CDC 的数据结构,包括变更是什么样的操作&#x…

《JDK8特性深入讲解》学习笔记

Lambda表达式 如果不适用lambda表达式的话,可以使用匿名内部类,但是代码会显得有点多 lambda表达式其实就是匿名内部类 Lambda表达式简化了匿名内部类的使用,语法更加简单。 语法规则 (参数类型 参数名称) -> {代码体; } Lambda表达…