
前言
许多纯英语的人似乎无法抗拒. 此问题由@Dr分享. 阿克塞尔(Axel Rauschmayer).
英语从这里开始~~
在此博客文章中,我们研究了Java的全局变量如何工作. 几个有趣的现象起作用: s的范围,所谓的全局对象等等.
范围
变量的词法作用域(简称: 作用域)是程序中可以访问它的区域. Java的作用域是静态的(它们在运行时不会更改),并且可以嵌套-例如:
functionfunc {//(A)
constfoo = 1;
如果(true){//(B)
constbar = 2;
}}

if语句(B行)引入的作用域嵌套在函数func(A行)的作用域之内.
范围S的最内部包围范围称为S的. 在示例中,func是if的.
词汇环境
在Java语言规范中,范围是通过词法环境“实现”的. 它们由两个部分组成:
因此,嵌套作用域树由嵌套环境树表示,并由外部引用链接.
全局对象
全局对象是其属性为全局变量的对象. (我们将很快检查它如何完全适合环境树. )它有几个不同的名称:
全局对象包含所有内置的全局变量.
全球环境
全局范围是“最-它没有. 它的环境就是全球环境. 每个环境都通过由外部引用链接的环境链与全局环境连接. 全局环境的外部引用为null.
全局环境结合了两个环境记录:

下图显示了这些数据结构. 范围和模块环境将在稍后说明.

接下来的两个小节将说明如何将对象记录和声明性记录组合在一起.
创建变量
要创建真正具有全局性的变量,您必须处于全局范围内-仅在s的顶级情况如此:
<>
constone = 1;
vartwo = 2; > <>
//所有共享相同的顶级范围:
console.log(一个); // 1
console.log(两个); // 2

//并非所有的声明都会创建全局对象的属性:
console.log(window.one); //未定义
console.log(window.two); // 2 >
此外全局变量 英文,全局对象包含所有内置的全局变量全局变量 英文,并通过对象记录将它们贡献给全局环境.
获取或设置变量
当我们获取或设置一个变量并且两个环境记录都具有该变量的绑定时,则声明式记录将获胜:
<>
让foo = 1; //声明性环境记录
globalThis.foo = 2; //对象环境记录
console.log(foo); // 1(声明式记录获胜)
console.log(globalThis.foo); // 2

>
模块化环境
每个模块都有自己的环境. 它存储所有顶级声明-包括. 模块环境的外部环境是全局环境.
结论: 为什么Java同时具有普通的全局变量和全局对象?
通常认为全局对象是一个错误. 因此,较新的构造(例如const,let和class)会创建普通的全局变量(在作用域内).
值得庆幸的是,大多数用现代Java编写的代码都位于ECMA模块和CommonJS模块中. 每个模块都有自己的范围,这就是为什么管理全局变量的规则对于基于模块的代码很少起作用的原因.
进一步阅读
关于本文
作者: . @Axel Rauschmayer博士
原文:
[Issue 1255]超大型Java应用程序的设计哲学
[问题1351] Java中的私有变量返回到搜狐,请查看更多
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-157367-1.html