你不知道的 JavaScript ----作用域

news/2024/4/28 12:57:41/文章来源:https://blog.csdn.net/qq_63358859/article/details/126996180

编译原理

在传统编译语言的流程中,程序中的一段源代码在执行之前会经历三个步骤,统称为编译

1.分词 / 词法分析:将字符串分解成有意义的代码块,这些代码块被称为词法单元token

var a = 2; => vara=2;

2.解析 / 语法分析:将词法单元流转换成抽象语法树(一个由元素逐级嵌套所组成的代表了程序语法结构的树,AST

 3.代码生成:将AST转换为可执行的代码(机器指令)

生成的机器指令,“为一个变量分配内存,将其命名为a,然后将值2保存进这个变量”

理解作用域

作用域与引擎、编译器

  • 引擎:从头到尾负责整个 JavaScript 程序的编译及执行过程;
  • 编译器 :负责词法分析、语法分析以及代码生成等 ;
  • 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

var a=1 个简单的赋值操作会执行两个动作

  • 编译时声明:首先编译器会在当前作用域下声明一个变量(如果之前没有声明过)
  • 运行时赋值:然后在运行时引擎会在作用域中查找该变量,如果找到就会进行赋值操作

引擎查询类型

引擎在作用域中查找变量时,引擎会为变量 a 进行LHS查询,还有另外一个查找的类型叫做RHS

  • RHS查询:获取某个变量的值
  • LHS查询:查找的目的是对变量进行赋值

function foo(a) {var b = areturn a + b
}
var c=foo(2)

来看一段三兄弟的对话把~

  • 引擎:我要获取foo执行RHS,作用域你那有没?
  • 作用域:有的老哥
  • 引擎:谢谢,我执行一下它。好了,我现在还需要赋值a执行LHS。
  • 作用域:好,编译器把它作为形参给我了。
  • 引擎:好的,我现在就对它赋值2。
  • 引擎:我又用到a了,不过这次我要获取下一对它RHS,还是得找你确定一下它的值
  • 作用域:没问题,它没变过,它还是2。
  • 引擎:非常感谢,下面我需要为b赋值执行一下LHS,我需要把a的值赋给它,你帮我看一下有没有b这个变量。
  • 作用域:有的,给你
  • 引擎:谢谢,接下来我需要对a和b都执行一下获取RHS,你帮我把它们的值给我好吗
  • 作用域:拿去不谢
  • 引擎:好的,我拿到了。现在我还有最后一件事要做,那就是c,我得对它进行赋值LHS,你帮我找一下,然后我好对它赋值。
  • 作用域:没问题,编译器声明过它
  • 引擎:谢谢,那我对它赋值了,大功告成!

作用域嵌套

作用域链

引擎从当前作用域开始查找变量,没有找到就一直往上找知道找到为止,或者找到全局作用域

 

LHS和RHS 引用都会在当前楼层进行查找,如果没有找到,就会坐电梯前往上一层楼,如果还是没有找到就继续向上,以此类推。一旦抵达顶层(全局作用域),可能找到了你所需的变量,也可能没找到,但无论如何查找过程都将停止。

异常

LHS 和 RHS 区别:RHS 查询在所有嵌套的作用域中找不到变量时,则会抛出异常 ReferenceError;而 LRS 在所有嵌套的作用域找不到变量时,在非严格模式下,会在顶层作用域即全局作用域创建该变量,而在严格模式下则会出现同 RHS 一样的情况。

查询类型变量还没有声明(普通模式下)变量还没有声明(严格模式下)
RHS抛出 ReferenceError 异常抛出 ReferenceError 异常
LHS全局作用域中创建一个具有该名称的变量,并返还给引擎抛出 ReferenceError 异常

ReferenceError:同作用域判别失败相关; TypeError:作用域判别成功,但是对结果的操作是非法或者不合理的。

总结

查询机制

作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用LHS查询;如果目的是获取变量的值,就会使用RHS查询

作用域链

LHS和RHS查询都会在当前执行作用域中开始,如果有需要(也就是说它们没有找到所需的标识符),就会向上级作用域继续查找目标标识符,这样每次上升一级作用域(一层楼),最后抵达全局作用域(顶层),无论找到或没找到都将停止。

异常机制
不成功的RHS引用会导致抛出ReferenceError异常。不成功的LHS引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用LHS引用的目标作为标识符,或者抛出ReferenceError异常(严格模式下)

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由《羊了个羊》想到的高并发架构之路

由《羊了个羊》为话题切入点,结合自己的面试经历,详细讲解了高并发架构设计的演进过程!前言要说最近一段时间最火的话题是什么,那必定是《羊了个羊》,频频冲上微博热搜第一。因访问量骤增,大量玩家涌入进来,高并发流量导致游戏服务器被接连击穿。《羊了个羊》服务器几天…

【复习】maven

1.maven的概述 1.2 为什么需要maven 环境的构建 清理:删除上一次构建的结果,为下一次构建做好准备编译:Java源程序编译成*.class字节码文件测试:运行提前准备好的测试程序报告:针对刚才测试的结果生成一个全面的信息…

MQ 消息队列时如何确保消息不丢失

面试官在面试候选人时,如果发现候选人的简历中写了在项目中使用了 MQ 技术(如 Kafka、RabbitMQ、RocketMQ),基本都会抛出一个问题:在使用 MQ 的时候,怎么确保消息 100% 不丢失? 这个问题在实际工作中很常见,既能考察候选者对于 MQ 中间件技术的掌握程度,又能很好地区分…

大数据开发!Pandas转spark无痛指南!

💡 作者:韩信子ShowMeAI 📘 大数据技术◉技能提升系列:https://www.showmeai.tech/tutorials/84 📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40 📘 本文地址:https:/…

Runc 漏洞(CVE-2021-30465)离线修复

文章目录前言一、漏洞详情二、修复步骤2.1 下载离线包2.2 检查runc版本2.3 查看runc安装路径2.4 备份runc2.5 替换二进制文件2.6 检查版本前言 runC 是 Docker,Kubernetes 等依赖容器的应用程序的底层容器运行时。此次爆出的严重安全漏洞可使攻击者以 root 身份在主…

java并发编程学习六——乐观锁CAS

文章目录一、CAS原理1.1 无锁保护共享变量1.1.1 不安全模式实现1.1.2 有锁安全实现1.1.3 无锁安全实现1.2 cas工作方式1.3 CAS的效率和特点二、原子整数三、原子引用3.1 AtomicReference3.2 ABA问题3.3 AtomicMarkableReference四、原子累加器一、CAS原理 CAS全称CompareAndSe…

【C++学习】C++入门知识(上)

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 到这里,本喵的C语言学习暂时就告一段落了,开始C的学习了,同样的&a…

Ubuntu安装opencv4(c++)遇到的问题及解决方法

安装教程,参考 Ubuntu 18.04安装c版OpenCV4 问题1:opencv无法下载IPPICV的问题 ippicv_2020_lnx_intel64_20191018_general.tgz 解决办法:解决编译opencv时,卡在IPPICV: Download: ippicv_2020_lnx_intel64_20191018…

hive开启自动转化common join和map join 带来的问题

背景: 我们采用的hive版本是3.1.2属于较新版本,此版本下hive本身默认开启map join 相关配置 hive默认开启map join,涉及的配置如下: hive.auto.convert.jointrue错误分析 错误发生在我们使用曝光转化明细宽表和素材维表进行j…

Bunifu UI WinForms 6.0.1 Crack

现代强大的设计元素 无论您是设计简单的 UI 还是需要高级用户界面和用户体验控件和组件,Bunifu 框架都配备了实现任何现代设计所需的一切。 用户界面和用户体验 您可以设计的内容没有限制 画廊 通过 Bunifu Rating 从您的应用中获取反馈 画廊 使用 Bunifu 面板…

【初学者入门C语言】之while、do-while、break及continue语句(五)

个人主页:天寒雨落的博客_CSDN博客-python,c,安装教程领域博主 💬 刷题网站:一款立志于C语言的题库网站蓝桥杯ACM训练系统 - C语言网 (dotcpp.com) 特别标注:该博主将长期更新c语言内容,初学c语言的友友们&#xff0…

javascript: 复制对象时的深拷贝及浅拷贝(chrome 105.0.5195.125)

一,js代码<html> <head><meta charset="utf-8"/><title>测试</title> </head> <body><button onclick="assign()">无效:变量直接赋值</button><br/><br/><br/><button oncli…

Android 资源文件存放位置 Drawable 与 Mipmap 区别

Drawable Drawable 文件夹存储 bitmap 文件(png, jpeg, gif)、9-patch 文件 和 xml 文件&#xff0c;这些文件用于描述包含多种状态 (normal, pressed, focused) 的可绘制形状或可绘制对象。 android 的 drawable 文件一共可以有&#xff1a; drawable-ldpi (低密度) drawable-…

如何根治 Script Error.

作者&#xff1a;卢峰&#xff08;清锐&#xff09; 本文简要介绍了 Script Error 问题的来龙去脉&#xff0c;但也不局限于 Script Error&#xff0c;对于通用的系统性问题&#xff0c;应该找到系统性解决方案&#xff0c;进而治标治本。 Script Error 原因与当前解法 受浏览…

第一个spring项目

第一个spring项目 1、maven依赖导入 <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.22</version> </dependency> <dependency><groupId>junit</gro…

计算机毕设源码网站基于SpringBoot的阳光线上交友系统

&#x1f345;文末获取联系&#x1f345; 目录 一、项目介绍 二、开题报告 三、截图 四、源码获取 一、项目介绍 基于SpringBoot的阳光线上交友系统-计算机毕设java毕业设计项目源码-可定制-IT实战课堂_哔哩哔哩_bilibili项目资料网址: http://www.itszkt.com毕业设计…

Python 内存管理的工作原理你了解吗?

Python 为开发者提供了许多便利&#xff0c;其中最大的便利之一是其几乎无忧的内存管理。开发者无需手动为 Python 中的对象和数据结构分配、跟踪和释放内存。运行时会为你完成所有这些工作&#xff0c;因此你可以专注于解决实际问题&#xff0c;而不是争论机器级细节。 尽管如…

唯杰地图之前端CAD图GIS数据访问权限配置

前言 数字经济时代,数据要素的价值日益凸显,与之相应的,数据安全问题也越来越受到重视。唯杰地图 VJMAP为CAD图或自定义地图格式WebGIS可视化显示开发提供的一站式解决方案,支持的格式如常用的AutoCAD的DWG格式文件、GeoJSON等常用GIS文件格式,它使用WebGL矢量图块和栅格瓦…

一文清晰讲明白DDD(领域驱动设计)的知识点

什么是DDD DDD&#xff08;领域驱动设计&#xff09;是一种处理高度复杂领域的设计思想&#xff0c;是一种架构设计方法论&#xff0c;是一种设计模式。以高内聚低耦合为目的&#xff0c;把一个复杂的软件应用系统中各个部分进行一个很好的拆解和封装&#xff0c;对软件系统进…

运算放大器积分电路上并联的电阻什么作用

学过模电的同学对运放积分电路应该都不会陌生&#xff0c;基本电路如下图中所示 积分电路主要是用来进行波形变换&#xff0c;放大电路失调的消除&#xff0c;以及反馈控制中的积分补偿。 常用积分电路将方波变幻成三角波&#xff0c;或者正弦波变成余弦波&#xff0c;今天我们…