余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

JS全局变量是如何工作的?(js全局变量是如何工作的原理)

xiyangw 2022-11-26 16:46 20 浏览 0 评论

原文: https://2ality.com/2019/07/global-scope.html翻译: 刘小夕

在这篇博文中,我们将研究 JavaScript 的全局变量是如何工作的。如: scripts的范围,所谓的全局对象等等。

1.作用域

变量的词法作用域(简称:作用域)是可以访问它的程序的区域。 JavaScript 的作用域是静态的(它们在运行时不会改变)并且它们可以嵌套 - 例如:

function
 func
()
 
{
 
// (A)
 
const
 foo 
=
 
1
;
 
if
 
(
true
)
 
{
 
// (B)
 
const
 bar 
=
 
2
;
 
}
}

if 语句引入的作用域(行B)嵌套在函数 func()(行A)的作用域内。

在示例中, func 是 if 的外层作用域。

2.词法作用域

在 JavaScript 语言规范中,作用域是通过词法作用域“实现”的。它们由两部分组成:

  • 将变量名映射到变量值的环境记录(可以想象成是字典)。这是 JavaScript 存储变量的地方。环境记录中的一个 key-value 条目称为绑定。
  • 对外部环境的引用 - 表示当前环境所代表的作用域的外部作用域的环境。

因此,嵌套作用域树可以由嵌套环境树表示。

3.全局对象

全局对象是一个对象,其属性是全局变量。

  • 无处不在: globalThis
  • 全局对象的其他名称取决于平台和语言构造:
  • window:是引用全局对象的经典方式,但它只适用于普通浏览器环境; 不在 Node.js 和 WebWorkers 中。
  • self:在浏览器中随处可用,包括 WebWorkers。但是 Node.js 不支持它。
  • global:仅在 Node.js 中可用。

全局对象包含所有内置全局变量。

4.全局环境

全局作用域是“最外层”作用域 - 它没有外部作用域。它的环境是全局环境。每个环境都通过由外部引用链接的一系列环境与全局环境相关联。全局环境的外部引用为 null。

全局环境结合了两个环境记录
  • 对象式环境记录,其作用类似于普通环境记录,但保持其绑定与对象同步。在这种情况下,对象是全局对象。
  • 声明式环境记录。

下图显示了这些数据结构。



接下来的两个小节将解释如何组合对象记录和声明式记录。

4.1创建变量

为了创建一个真正全局的变量,你必须处于全局作用域内 - 必须要在 scripts 的顶层:

  • 顶级 const, let 和 class 在声明式环境记录中创建绑定。
  • 顶级 var 和函数声明在对象式环境记录中创建绑定。
<
script
>
 
const
 one 
=
 
1
;
 
var
 two 
=
 
2
;
</
script
>
<
script
>
 
// All scripts share the same top-level scope:
 console
.
log
(
one
);
 
// 1
 console
.
log
(
two
);
 
// 2
 
// Not all declarations create properties of the global object:
 console
.
log
(
window
.
one
);
 
// undefined
 console
.
log
(
window
.
two
);
 
// 2
</
script
>

此外,全局对象包含所有内置全局变量,并通过对象式记录将它们给全局环境。

4.2读取/设置变量

当我们获取或设置变量并且两个环境记录都具有该变量的绑定时,声明式环境记录将获胜:

<
script
>
 let foo 
=
 
1
;
 
// 声明式环境记录
 globalThis
.
foo 
=
 
2
;
 
// 对象式环境记录
 console
.
log
(
foo
);
 
// 1 (声明式记录获胜)
 console
.
log
(
globalThis
.
foo
);
 
// 2
</
script
>

5.模块环境

每个模块都有自己的环境,它存储所有顶级声明 - 包括导入。模块环境的外部环境是全局环境。

结论:为什么JavaScript既有全局变量又有全局对象?

通常认为将全局变量挂载到全局对象上是错误的。因此,较新的构造(如 const, let 和 classes)会创建正常的全局变量,不会成为全局对象的属性。(在 script作用域内时)。

值得庆幸的是,大多数用现代 JavaScript 编写的代码都存在于 ECMAScript 模块和 CommonJS模块中,每个模块都有自己的作用域。

我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取。


相关推荐

前后端分离 Vue + NodeJS(Koa) + MongoDB实践

作者:前端藏经阁转发链接:https://www.yuque.com/xwifrr/gr8qaw/vr51p4写在前面闲来无事,试了一下Koa,第一次搞感觉还不错,这个项目比较基础但还是比较完整了,...

MongoDB 集群如何工作?

一、什么是“MongoDB”?“MongoDB”是一个开源文档数据库,也是领先的“NoSQL”数据库,分别用“C++”“编程语言”编写,使用带有“Schema”的各种类似JSON的文档,是也分别被认为...

三部搭建mongo,和mongo UI界面

三步搭建mongo,和mongoUI界面安装首先你需要先有一个docker的环境检查你的到docker版本docker--versionDockerversion18.03.1-ce,b...

Mongodb 高可用落地方案

此落地方案,用于实现高可用。复制集这里部署相关的复制集,用于实现MongoDB的高可用。介绍MongoDB复制集用于提供相关的数据副本,当发生硬件或者服务中断的时候,将会从副本中恢复数据,并进行自动...

一次线上事故,我顿悟了MongoDB的精髓

大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,继续学习MongoDB分片的理论与实践,...

IDEA中安装MongoDB插件-再也无要nosql manager for mongodb

大家都知道MongoDB数据库作为典型的非关系型数据库被广泛使用,但基于MongoDB的可视化管理工具-nosqlmanagerformongodb也被用的较多,但此软件收费,所以国内的破解一般...

数据库监控软件Lepus安装部署详解

Lepus安装部署一、软件介绍Lepus是一套开源的数据库监控平台,目前已经支持MySQL、Oracle、SQLServer、MongoDB、Redis等数据库的基本监控和告警(MySQL已经支持复...

YAPI:从0搭建API文档管理工具

背景最近在找一款API文档管理工具,之前有用过Swagger、APIManager、Confluence,现在用的还是Confluence。我个人一直不喜欢用Swagger,感觉“代码即文档”,让代...

Mac安装使用MongoDB

下载MongoDB包:https://www.mongodb.com/download-center解压mongodb包手动解压到/usr/local/mongodb文件夹配置Mac环境变量打开环境...

保证数据安全,不可不知道的MongoDB备份与恢复

大家在项目中如果使用MongoDB作为NOsql数据库进行存储,那一定涉及到数据的备份与恢复,下面给大家介绍下:MongoDB数据备份方法在MongoDB中我们使用mongodump命令来备...

MongoDB数据备份、还原脚本和定时任务脚本

备注:mongodump和mongorestore命令需要在MongoDB的安装目录bin下备份脚本备份格式/usr/local/mongodb/bin/mongodump -h ...

等保2.0测评:mongoDB数据库

一、MongoDB介绍MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产...

MongoDB入门实操《一》

什么是MongoDBMongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之...

Python安装PyMongo的方法详细介绍

欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练、PDF电子文档、面试集锦、学习资料等。前言本文主要给大家介绍的是关于安装PyMongo的...

第四篇:linux系统中mongodb的配置

建议使用普通用户进行以下操作。1、切换到普通用户odysee。2、准备mongodb安装包,自行去官网下载。3、解压安装包并重命名为mongodb4.04、配置mongodbcdmongod...

取消回复欢迎 发表评论: