ES2020 系列:全局对象 globalThis

简介: ES2020 系列:全局对象 globalThis

640.png

全局对象


全局对象提供可在任何地方使用的变量和函数。默认情况下,这些全局变量内置于语言或环境中。


在浏览器中,它的名字是 "window",对 Node.js 而言,它的名字是 "global",其它环境可能用的是别的名字。


最近,globalThis 被作为全局对象的标准名称加入到了 JavaScript 中,所有环境都应该支持该名称。在有些浏览器中,即 non-Chromium Edge,尚不支持 globalThis,但可以很容易地对其进行填充(polyfilled)。


假设我们的环境是浏览器,我们将在这儿使用 "window"。如果你的脚本可能会用来在其他环境中运行,则最好使用 globalThis


全局对象的所有属性都可以被直接访问:


alert("Hello");
// 等同于
window.alert("Hello");


在浏览器中,使用 var(而不是 let/const!)声明的全局函数和变量会成为全局对象的属性。


var gVar = 5;
alert(window.gVar); // 5(成为了全局对象的属性)


请不要依赖它!这种行为是出于兼容性而存在的。现代脚本通过使用 JavaScript modules[1] 来避免这种情况的发生。


如果我们使用 let,就不会发生这种情况:


let gLet = 5;
alert(window.gLet); // undefined(不会成为全局对象的属性)


如果一个值非常重要,以至于你想使它在全局范围内可用,那么可以直接将其作为属性写入:


// 将当前用户信息全局化,以允许所有脚本访问它
window.currentUser = {
  name: "John"
};
// 代码中的另一个位置
alert(currentUser.name);  // John
// 或者,如果我们有一个名为 "currentUser" 的局部变量
// 从 window 显示地获取它(这是安全的!)
alert(window.currentUser.name); // John


也就是说,一般不建议使用全局变量。全局变量应尽可能的少。与使用外部变量或全局变量相比,函数获取“输入”变量并产生特定“输出”的代码设计更加清晰,不易出错且更易于测试。


使用 polyfills


我们使用全局对象来测试对现代语言功能的支持。

例如,测试是否存在内建的 Promise 对象(在版本特别旧的浏览器中不存在):


if (!window.Promise) {
  alert("Your browser is really old!");
}


如果没有(例如,我们使用的是旧版浏览器),那么我们可以创建 "polyfills":添加环境不支持但在现代标准中存在的功能。


if (!window.Promise) {
  window.Promise = ... // 定制实现现代语言功能
}


总结


  • 全局对象包含应该在任何位置都可见的变量。
    其中包括 JavaScript 的内建方法,例如 "Array" 和环境特定(environment-specific)的值,例如 window.innerHeight — 浏览器中的窗口高度。
  • 全局对象有一个通用名称 globalThis
    ……但是更常见的是使用“老式”的环境特定(environment-specific)的名字,例如 window(浏览器)和 global(Node.js)。由于 globalThis 是最近的提议,因此在 non-Chromium Edge 中不受支持(但可以进行 polyfills)。
  • 仅当值对于我们的项目而言确实是全局的时,才应将其存储在全局对象中。并保持其数量最少。
  • 在浏览器中,除非我们使用 modules[2],否则使用 var 声明的全局函数和变量会成为全局对象的属性。
  • 为了使我们的代码面向未来并更易于理解,我们应该使用直接的方式访问全局对象的属性,如 window.x
目录
相关文章
|
10月前
|
安全 Java API
Spring Boot 3.x 在 2.x基础上有什么重大的改进?
Spring Boot 3.x于2022年11月发布,带来了诸多重大更新。主要改进包括:最低要求Java 17,整合Jakarta EE 9,优化实例化和配置支持,基于Spring Framework 6.x,引入AOT编译,增强GraalVM原生映像支持,改进日志管理和集成测试,提供更详细的Actuator监控功能,以及对Spring Cloud的兼容性更新。这些变化为现代云原生应用开发提供了更强支持。
845 36
|
网络协议 Windows
【常用命令】netstat -ano命令图文详细说明
【常用命令】netstat -ano命令图文详细说明
1173 0
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
434 3
|
Linux 调度
linux中进程与cpu核的绑定
linux中进程与cpu核的绑定
443 0
|
算法 关系型数据库 MySQL
浅析MySQL Join Reorder算法
本文浅析了MySQL Join Reorder算法的流程,cost计算,剪枝算法等,希望通过本文能帮助大家了解MySQL优化器生成执行计划的具体流程。
|
测试技术 uml
UML 建模语言的基础概念与应用
【8月更文第23天】UML (Unified Modeling Language) 是一种用于系统架构设计的标准建模语言。
541 1
|
Android开发
Android获取当前连接的wifi名称
Android获取当前连接的wifi名称
681 6
|
存储 人工智能 安全
AI伦理与法规:确保技术安全可控
【7月更文第20天】随着人工智能(AI)技术的飞速发展,其在医疗、金融、教育、交通等领域的应用日益广泛,极大地推动了社会进步和经济发展。然而,AI的广泛应用也引发了诸多伦理问题和对个人隐私的潜在威胁,这些挑战要求我们在追求技术创新的同时,必须建立和完善相应的伦理规范与法律法规框架,以确保技术的安全可控。本文将探讨AI发展中的主要伦理问题、隐私保护策略以及相关的法律法规,并通过代码示例展示如何在实践中实施隐私保护措施。
1015 0
|
数据可视化
R语言大学城咖啡店消费问卷调查数据报告:信度分析、主成分分析可视化
R语言大学城咖啡店消费问卷调查数据报告:信度分析、主成分分析可视化
|
存储 机器学习/深度学习 自然语言处理
Mini but Mighty | 简直就是微调ViT神器,有了Mimi微调方法,别的不用选了!又稳又快!
Mini but Mighty | 简直就是微调ViT神器,有了Mimi微调方法,别的不用选了!又稳又快!
585 1

热门文章

最新文章