JavaScript--作用域是什么

news2024/11/21 0:20:40

作用域是什么

编译原理

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

  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异常(严格模式下)

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

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

相关文章

知识点总结

1、Uboot的流程调用: 1.1、cmd_process函数是怎么被调用到的: cmd_process在common/command.c 1.2、uboot阶段断电,后续起不来,可能要换线去使用,也许和电源线有关 2、git 相关使用 2.1 .gitignore相关的使用 1、…

北京证券公司港股通交易佣金手续费最低是多少?万0.8?港股通纳入规则是怎么样的?

港股通交易佣金概述 港股通的交易佣金可能会因证券公司和投资者的不同而有所差异。 北京证券公司的港股通交易佣金最低可能万分之零点八(0.008%),但这需要投资者与证券公司客户经理了解,进行沟通和申请。 一般来说,…

我手握多篇顶会一作,引用量几百,却连个像样的博士offer都申请不到

卷,卷,卷。在当下整个 AI 领域,一切价值衡量标准仿佛都在经历一场恶性的通货膨胀…… 让我们想象这样一个角色: 一个来自普通家庭的学生刻苦努力的完成了自己的学业。他在领域内的顶级会议中发表了多篇论文,并且其论文…

OpenHarmony应用开启Service以及完成自启动和常驻

一.背景 由于有需求实现一个后台常驻服务,这里就是来实现在鸿蒙里面如何实现后台服务并且实现自启动和常驻 二.添加服务 如下来添加服务 然后此时直接运行这个hap是报错的,如下: 此处参考: 应用中添加ServiceExtensionAbility然后安装HAP时提示“code:9568344 error: inst…

【NumPy】全面解析NumPy的bitwise_xor函数:高效按位异或操作指南

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

I.MX6ULL主频和时钟配置实验

系列文章目录 I.MX6ULL主频和时钟配置实验 I.MX6ULL主频和时钟配置实验 系列文章目录一、前言二、I.MX6U 时钟系统详解三、硬件原理四、 7 路 PLL 时钟源五、时钟树简介六、内核时钟设置七、PFD 时钟设置八、AHB、IPG 和 PERCLK 根时钟设置九、实验程序编写十、编译下载10.1编写…

探索Python中的随机数生成与统计分析

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、随机数的魅力与实用性 1. 随机数生成基础 2. 批量生成随机数 二、随机数的高级应用&a…

Linux——Linux服务管理

服务管理大作业要求: 基本拓扑如下: 按照要求完成基本的系统管理任务: 完成所有系统的主机名、网络配置; 本次作业共需要3台虚拟机,分别作为客户端、综合应用服务器、存储服务器。三台虚拟机操作系统均为CentOS-Stream…

mybatis新增到数据库后返回当前ID

描述 在开发中,插入一条数据并返回当前的ID的场景很多 之前用mybatisPlus自带的api非常简单,调用完save or insert之后再getId即可。 今天使用mybatis的时候也遇到了这个场景,在此记录一下。 解决问题 直接再insert标签里面表明属性 核心…

软考案例题总结

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

WPS PPT学习笔记 2 结构页的制作

制作PPT结构页 制作封面页、目录页、封底页。它们都属于结构页。而时间轴页,流程图页,框架图页这些属于内容页。 做一份PPT 讲一个故事 封面页 开头, 目录页 脉络, 各式内容页 详情, 封底页 结尾。 所有的结构页…

Docker安装OnlyOffice

工作需要,多人在线编辑同一文档,找了一圈发现onlyoffice满足需求,于是使用docker安装了社区版本。下面记录下安装过程。 Onlyoffice 是什么? Onlyoffice 是一个多端协同的 Office 办公套件,相当于微软的 Office365 全…

jenkins+sonarqube部署与配置过程

1、部署jenkins(本文不做说明) 2、部署sonarqube(docker-compose) version: "2.1"services:sonarqube:image: sonarqube:9.9.4-communitycontainer_name: sonarqubedepends_on:- dbports:- 9000:9000networks:- sonarnetenvironment:SONARQU…

前端学习--React部分

文章目录 前端学习--React部分前言1.React简介1.1React的特点1.2引入文件1.3JSX🍉JSX简介与使用🍉JSX语法规则 1.4模块与组件🍉模块🍉组件 1.5安装开发者工具 2.React面向组件编程2.1创建组件🍉函数式组件&#x1f349…

菜鸟的JavaSE学习之旅5

这是一个目录 面向对象类和对象类对象类的定义一个对象的内存成员变量和局部变量定义位置不同作用范围不同默认值不同内存位置不同生命周期不同 关键字this关键字 构造方法标准的类 面向对象 当需要实现一个功能的时候,不关心具体的步骤,而是找一个具有…

前端canvas实现图片涂鸦(Vue2、Vue3都支持)

先看一下效果图吧 代码组成&#xff1a;画笔大小、颜色、工具按钮都是组件&#xff0c;通俗易懂&#xff0c;可以按照自己的需求调整。 主要代码App.vue <template><div class"page"><div class"main"><div id"canvas_panel&qu…

RedHat9 | DNS剖析-DNS服务器综合部署

一、配置需求及网络拓扑 1、配置拓扑 2、配置需求 使用【主DNS服务器】管理meaauf.cn域和gz.meaauf.cn域&#xff1b;并将bj.meaauf.cn域委派给【子域DNS服务器】进行管理。在【主DNS服务器】上添加相应的A记录、别名记录、MX记录和PTR记录&#xff1a;【辅助DNS服务器】作为…

乡村振兴的实践与探索:以生态优先、绿色发展为导向,推动农村人居环境整治,建设美丽宜居乡村

一、引言 随着我国经济社会的快速发展&#xff0c;乡村振兴成为了新时代的重要战略。在这一背景下&#xff0c;以生态优先、绿色发展为导向的乡村振兴模式成为了重要的实践方向。本文旨在探讨如何通过生态优先、绿色发展的理念&#xff0c;推动农村人居环境整治&#xff0c;建…

FL Studio v21.2.3.4004中文破解版百度网盘下载

FL Studio v21.2.3.4004中文破解版是一款完整的软件音乐制作环境或数字音频工作站 (DAW)。代表了超过 18 年的创新发展&#xff0c;它在一个软件包中提供了您创作、编曲、录制、编辑、混音和掌握专业品质音乐所需的一切。FL Studio v21.2.3.4004中文破解版现在是世界上最受欢迎…

基于香橙派搭建家庭网盘

一、概述 家庭网盘是一种用于家庭用户的在线存储和文件共享服务。它允许家庭成员在云端存储、同步和分享照片、视频、文档等文件&#xff0c;方便快捷地访问和管理个人和家庭数据。家庭网盘通常提供安全可靠的数据存储和备份功能&#xff0c;保障用户数据的安全性。此外&#x…