JavaScript--作用域是什么

作用域是什么

编译原理

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

  1. 分词/词法分析
    这个过程由字符组成的字符串分解成有意义的代码块,这些代码块成为词法单元。
分词和词法分析之间的主要差异在于词法单元的识别是有状态还是无状态的方式进行的,如果词法单元生成器在判断a是一个独立的词法单元还是被其他词法单元的一部分时,成为这个过程为词法分析
  1. 解析/语法分析
    这个过程是将词法单元流转换为一个由元素逐级嵌套所组成的程序语法结构的树,这个树被称为抽象词法树
  2. 代码生成
    将ast转换为可以执行的代码的过程叫做代码生成。

理解作用域

JavaScript引擎不会有大量的时间用来优化,JavaScript的编译过程不是发生在构建之前的。

名词

  • 引擎: 从头到尾负责整个JavaScript程序的编译和执行过程
  • 编译器: 词法分析 代码生成
  • 作用域: 负责收集并维护所有声明的标识符组成的一系列的查询。
    遇到var a,编译器会询问作用域是否已经有一个该名称的变量存在于同一个作用域的集合中,如果是,编译器会忽略该声明,继续进行编译,否则会要求作用域在当前作用域集合中声明一个新的变量,命名为a
    接下来编译器会为引擎生成运行时所需的代码,这些代码会被用来处理a=2这个赋值的操作,引擎运行时会首先询问这个作用域,在当前作用域集合中是否存在一个叫做a的变量,如果是,引擎就会使用这个变量。如果否,引擎就会继续查找该变量。
    引擎会为变量a进行LHS查询,另一个查找的类型叫做RHS,当变量出现在赋值操作的左侧进行LHS查询,出现在右侧的时候进行RHS查询。
    RHS查询类似简单的查找某个变量的值,LHS则是试图找到变量的容器本身。
    console.log(a)其中对于a的引用是一个RHS引用,这里a并没有赋予任何值,需要查找a的值,才能够进行赋值。这里对a的引用是一个RHS引用。
a = 2 // 这里是一个LHS引用,实际上并不关心当前的值是什么,指示想要为这两个赋值找到一个目标。
function foo(a) {
    console.log(a)
} 
foo(2)

最后一行foo函数的调用需要对foo进行rhs引用。代码中的隐式的a=2操作可能容易被忽略掉,这个操作发生在2被当作参数传递给foo函数,2会被分配给参数a,为了给参数a分配值,需要进行一次LHS引用查询。
编译器还可以在代码生成的同时处理声明和值的定义。
在这里插入图片描述

作用域

当一个块或者函数嵌套在另一个块或者函数中,就发生了作用域的嵌套,在当前作用域中无法找到某个变量的时候,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量,或者抵达最外层的作用域也就是全局作用域为止。

function foo(a) {
    console.log( a + b )
}
var b = 2
foo( 2 )

对于b的rhs无法在函数foo内部完成,在上一级的作用域中去查找。
遍历嵌套作用域链的规则: 引擎从当前的执行作用域开始查找变量,如果找不到,就继续向上一级继续查找,当抵达最外层的全局作用域的时候,无论是找到还是没有找到,查找过程都会停止。

异常

在变量还没有声明的情况下, 这两种查询的行为是不一样的。

function foo(a) {
    console.log(a + b)
    b = a 
}
foo(2)

第一次b进行RHS查询的时候都是无法找到该变量的,如果RHS在所有的嵌套的作用域中都找不到所需的变量,引擎就会抛出ReferenceError异常。
当进行LHS查询的时候,如果在顶层全局作用域中无法找到目标变量,全局作用域中就会创建一个具有该名称的变量,并将器返回给引擎,前提是程序运行在非严格模式下。
如果查找的目的是对变量进行赋值,那么就会使用LHS查询;如果目的是获取变量的值,就会使用RHS查询。
不成功的RHS会导致抛出ReferenceError异常,不成功的LHS会导致自动隐式的创建一个全局变量(非严格模式下)。使用LHS引用的目标作为标识符,或者抛出ReferenceError异常(严格模式下)

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

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

相关文章

【网络协议】应用层协议HTTPS

文章目录 为什么引入HTTPS?基本概念加密的基本过程对称加密非对称加密中间人攻击证书 为什么引入HTTPS? 由于HTTP协议在网络传输中是明文传输的,那么当传输一些机密的文件或着对钱的操作时,就会有泄密的风险,从而引入…

项目构建工具maven

一、概述 1、maven是apache的一个开源项目,是一个优秀的项目构建/管理工具 2、apache(软件基金会、非盈利组织、管理维护一些开源项目) 二、功能 1、管理项目中jar包和jar包与jar包之间的依赖 2、完成项目编译、测试、打包 三、核心文件 pom.xml:在里面配置相…

5.28 学习总结

一.CSS学习(一) 一、CSS简介 1、什么是CSS CSS:Cascading Style Sheet 层叠样式表是一组样式设置的规则,用于控制页面的外观样式 2、为什么使用CSS 实现内容与样式的分离,便于团队开发样式复用,便于网站的后期维护页面的精确…

Leecode热题100---二分查找---搜索插入位置

题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 nums 为 无重复元素 的 升序 排列数组 常规思路: class Solution { public:int f…

MySQL--复合查询

之前学过了基本的查询,虽然已经够80%的使用场景了,但是依旧需要了解剩下的20%。 一、多表笛卡尔积(多表查询) 以前我们使用基本查询的时候,from后面就跟一张表名,在多表查询这里,from后面可以跟…

跟进2年弄丢1.8亿,你的大客管理错在哪里?

数量并非目的之所在,质量才是根本之道。重视1%的超级用户,才是提高效率的关键所在。 ——凯文凯利 在当今的商业环境中,大客户已成为销售服务型企业最宝贵的资产。他们不仅贡献了企业收入的重要一环,…

监管端..

文章目录 1. 登录流程2. 日志AOP 1. 登录流程 使用账号(手机号)、密码、验证码。登录就是获取token的,输入的账号密码用RSA加密(非对称) 首先输入账号密码,在发送手机验证码时候先校验账号密码有没有输入…

AI智能体研发之路-模型篇(三):中文大模型开、闭源之争

博客导读: 《AI—工程篇》 AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效 AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署 AI智能体研发之路-工程篇(三&am…

kafka-消费者组偏移量重置

文章目录 1、消费者组偏移量重置1.1、列出所有的消费者组1.2、查看 my_group1 组的详细信息1.3、获取 kafka-consumer-groups.sh 的帮助信息1.4、 偏移量重置1.5、再次查看 my_group1 组的详细信息 1、消费者组偏移量重置 1.1、列出所有的消费者组 [rootlocalhost ~]# kafka-…

光伏智慧化运营解决方案的应用和价值

在社会对新能源需求的不断扩大,光伏已经成为了可再生能源的重要组成部分,随着光伏电站数量和规模的不断扩大,相关企业和用户都就开始关注如何能够高效精准的进行电站管理,对此,鹧鸪云提出了光伏智慧化运营解决方案&…

Docker 入门版

目录 1. 关于Docker 2. Dockr run命令中常见参数解读 3. Docker常见命令 4. Docker 数据卷 5. Docker本地目录挂载 6. 自定义镜像 Dockerfile 语法 自定义镜像模板 Demo 7. Docker网络 1. 关于Docker 在docker里面下载东西,就是相当于绿色面安装板&#x…

B站广告推广引流哪里能做?

哔哩哔哩(B站)作为国内领先的年轻人文化社区与视频平台,其独特的二次元文化氛围和高度活跃的用户群体,成为了众多品牌寻求突破、触达年轻消费群体的理想阵地。在这样一个充满活力但又竞争激烈的平台上有效推广,吸引并留…

2024/5/28 P1247 取火柴游戏

取火柴游戏 题目描述 输入 k k k 及 k k k 个整数 n 1 , n 2 , ⋯ , n k n_1,n_2,\cdots,n_k n1​,n2​,⋯,nk​,表示有 k k k 堆火柴棒,第 i i i 堆火柴棒的根数为 n i n_i ni​;接着便是你和计算机取火柴棒的对弈游戏。取的规则如下&…

编译安装Apache httpd服务

目录 1.初始化设置,将Apache所需软件包传到 /opt 目录下 (1)关闭防火墙 (2)上传软件包到/opt目录 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径,并把httpd服务的可执行程序文件…

设置AXI主寄存器切片和AXI数据FIFO

设置AXI主寄存器切片和AXI数据FIFO 打开MHS文件&#xff0c;并为每个AXI主机设置启用寄存器切片/启用数据FIFO。到 确定正确的设置&#xff0c;使用下表中的信息搜索MHS。 进行搜索时&#xff0c;将<intf_name>替换为相关的BUS_INTERFACE名称。 例如&#xff0c;BUS_INTE…

AI开发初体验:昇腾加持,OrangePi AIpro 开发板

文章目录 一、前言二、板子介绍2.1 拆箱2.2 板子规格2.2.1 常规项目2.2.2 扩展项目2.2.3 操作系统 2.3 点板画面 三、AI程序初体验3.1 新奇的地方3.2 运行第一个AI程序3.2.1 硬件连接3.2.2 串口连接3.2.3 开启外部IP端口3.2.4 查询板子IP地址3.2.5 了解 juypter lab 启动脚本&a…

前端响应式期末作品

网页设计成品_前端响应式 主题&#xff1a;租房网站&#xff0c;共6个html页面&#xff0c;包含首页&#xff0c;登录注册&#xff0c;租房新闻&#xff0c;租房精选&#xff0c;租房详情&#xff0c;数据可视化页面&#xff08;可以修改内容&#xff09; 采用技术&#xff1a;…

webserver服务器从零搭建到上线(九)|⭐️EventLoop类(一)——详解成员变量、简述成员方法

在本节中&#xff0c;我们一起来仔细探讨一下EpollPoller类。该类可以说是muduo库中最最核心的类了&#xff0c;一定要搞懂&#xff01; 文章目录 私有成员using ChannelList std::vector<Channel*>looping_、quit_threadId_pollReturnTime_、poller_wakeup_fd、wakeupC…

音视频集市应用融合平台方案

音视频应用即有深度又有广度&#xff0c;如何让一个平台拥有更多功能更灵活的拓展能力&#xff0c;从单体模块化&#xff0c;多插件到微服务都有大量的实践。 笔者在实际开发过程也同样面对这些纷繁复杂而又必须共容共通需求的挑战。 在实战开发了大量从服务端到设备端再到浏览…

软考案例题总结

数据库故障与恢复 E-R图 关系规范化 SQL 涉及的知识点一般包括&#xff1a;表的创建、视图和索引创建的关键字、表的查询、聚集函数、子查询、分组查询、集合操作、外连接存储过程、游标、触发器以及表的更新、插入和删除