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

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

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

相关文章

实战指南:Vue 2基座 + Vue 3 + Vite + TypeScript微前端架构实现动态菜单与登录共享

实战指南:Vue 2基座 Vue 3 Vite TypeScript子应用vue2微前端架构实现动态菜单与登录共享 导读: 在当今的前端开发中,微前端架构已经成为了一种流行的架构模式。本文将介绍如何结合Vue 2基座、Vue 3子应用、Vite构建工具和TypeScript语言…

基于Docker的ROS开发

本文主要介绍如何使用Docker在Windows和Linux环境中部署并使用ROS,通过Docker Container运行ROS,可以方便我们在一个本地环境中运行多个ROS版本。 更多内容,访问专栏目录获取实时更新。 关于ROS的版本 参考ROS1 Distribution Wiki和ROS2 Dis…

nginx源码阅读理解 [持续更新,建议关注]

文章目录 前述一、nginx 进程模型基本流程二、源码里的小点1.对字符串操作都进行了原生实现2.配置文件解析也是原生实现待续 前述 通过对 nginx 的了解和代码简单阅读,发现这个C代码的中间件确实存在过人之处,使用场景特别多,插件模块很丰富…

10款AI工具,让工作生活学习更高效

我看大家都推荐的差不多了,常见好用的PC软件就那些,我不想反复“咀嚼”了,我想另辟蹊径推荐点不一样的,比如10款PC端的AI网站。AI已经全方位“侵入”我们的生活,从AI写作到AI绘画,从AI视频到AI语音&#xf…

Thingsboard规则链:Switch节点详解

在物联网(IoT)领域,数据的高效处理与自动化决策是构建智能系统的核心。作为一款强大的物联网平台,Thingsboard通过其规则引擎为开发者提供了高度灵活的工具,其中Switch节点是实现消息条件路由的关键组件。本文将全方位…

【深度学习】Transformer梳理

零、前言 对于transformer,网上的教程使用记号、术语不一 。 最关键的一点,网上各种图的简化程度不一 (画个图怎么能这么偷懒) ,所以我打算自己手画一次图。 看到的最和善(但是不是那么靠谱,我…

黑龙江某市数字孪生地下水监测系统平台项目建设经验

项目背景 地下水是一种特殊而珍贵的资源,它具有不可替代性,与经济发展及人民生活息息相关,针对日趋严峻的水资源危机,如何合理利用有限的水资源,保障国民经济的可持续发展是一个迫切需要解决的问题。 黑龙江某市积极…

eclipse启动时间过长的问题

项目场景: 由于我用eclipse比较习惯,虽然IDEA很好,但是因为收费,所以在个人开发学习过程中一直还是使用eclipse,本文不讨论eclipse与IDEA孰优孰劣问题。 开发环境: 操作系统:Windows 11 22631…

【小呆的力学笔记】连续介质力学的知识点回顾一:运动和变形

文章目录 1. 运动的描述2. 拉格朗日描述下的变形2.1 线元的变化2.2 体元的变化2.3 面元的变化 1. 运动的描述 在连续介质力学中,存在着两种对运动的描述,一种为拉格朗日描述,即通过描述每个物质点的运动来描述整个变形体的运动,也…

如何将音频中的人声分离出来?

想要把一段视频中的人声跟背景音乐分离开来,找个好一点的音频处理软件就能把声音分离了,常见的有以下方法,一起来看看吧。 pr 打开软件,然后将电脑上的音频文件,上传到软件中,然后按住[ctrla]选择所有音频…

【数据结构】 排序算法 ~ 总结篇

文章目录 1. 排序几个重点概念的理解2. 排序算法的分析🐧 1. 排序几个重点概念的理解 2. 排序算法的分析🐧

Git学习篇

目录 使用命令导入项目 使用命令导入项目 1. 使用git init 命令初始化一个新的Git仓库。 git init 是 Git 命令,用于初始化一个新的 Git 仓库。当您想要开始跟踪一个新项目的版本控制时,可以运行 git init 命令来初始化一个空的 Git 仓库。 如果出现以下…

6-继承

6-继承 1、基本语法和方式2、继承的基本特点2.1 三种继承方式相同的基本点2.2 三种继承方式的差别2.3 公有继承的独有特点 3、子类的构造、析构3.1 子类的构造3.2 子类的析构3.3 子类的拷贝构造函数3.4 子类的拷贝赋值 4、多重继承4.1 内存布局4.2 类型转换4.3 名字冲突问题 5、…

10. C++异步IO处理库和使用libevent实现高性能服务器

C比较有名的异步IO处理库 libevent 这个主要使用的是epoll。libevthplibuvlibev 我们主要介绍libevent。 libevent重要函数 event_base_new 这个可以对应于epoll_create也就是创建一个实例。还可以初始化libevent所有管理相关的代码。比如说所能用到的队列,栈&a…

Linux内核编译流程3.10

一、内核源代码编译流程 编译环境: cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) Linux内核版本: uname -r 3.10.0-693.el7.x86_64 编译内核源代码版本:linux-4.19.90-all-arch-master cp /boot/config-xxx到内核源…

数据库(9)——DQL基础查询

数据查询 数据查询是SQL中最复杂的,语法结构为 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后字段列表 ORDER BY 排序字段列表 LIMIT 分页参数 查询多个字段 SELECT 字段1,字段2...FROM…

LeetCode583:两个字符串的删除操作

题目描述 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 代码 解法1 /*dp[i][j]:以i-1为结尾的wrod1中有以j-1为尾的word2的个数为了让word1和word2相同,最少操作…

linux开发之设备树基本语法一

设备树的根节点 设备树子节点和子子节点,子节点在根节点范围内 包含子节点以及子子节点 节点名称 比如这里led就是这个gpio的小名,可以直接用 gpio22020101是这里的名字,也就是要用这个gpio,符号后面的一串数字使用了这个gpio的寄存器地址,因为可能会用很多gpio,所以加入寄存…

Pushmall共享分销电商SaaS版2024年 5月模块开发优化完成

Pushmall共享分销电商 2024年 5月模块开发优化完成 1、**实现SaaS框架业务:**多租户、多商家、多门店,及商家入驻、商品管理。 2、租户小程序管理:对租户的小程序业务管理。 3、店铺小程序管理:对租户多店铺小程序绑定。 4、会员分…

新火种AI|警钟长鸣!教唆自杀,威胁人类,破坏生态,AI的“反攻”值得深思...

作者:小岩 编辑:彩云 在昨天的文章中,我们提到了谷歌的AI Overview竟然教唆情绪低迷的网友“从金门大桥跳下去”。很多人觉得,这只是AI 模型的一次错误判断,不会有人真的会因此而照做。但现实就是比小说电影中的桥段…