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
目录
相关文章
|
3月前
|
人工智能 运维 JavaScript
Claude Code配置整合包小白友好版一键下载,只有一个需要主动操作!其他全部全自动!
Jarrod Watts 的 Claude Code 配置包,整合 Rules(自动规范)、Agents(4大助手)、Hooks(自动检查)、Commands、Skills 等六大模块,开箱即用,大幅提升 AI 编程效率与代码质量。TypeScript 优先,安装简单,新手友好,老手可按需定制。(239字)
|
安全 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的兼容性更新。这些变化为现代云原生应用开发提供了更强支持。
1848 36
|
IDE API 开发工具
Gleam
Gleam 是面向 Erlang 虚拟机的类型化语言,Gleam 的语法对于类型化语言来说非常优雅和简单。如果能看到 Gleam 像 Elixir 一样成功,那就太酷了。
956 4
|
11月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
679 5
|
Linux 调度
linux中进程与cpu核的绑定
linux中进程与cpu核的绑定
662 0
A module cannot have multiple default exports.是、关闭Vetur扩展,或者重启项目,神奇的bug,复制代码造成的
A module cannot have multiple default exports.是、关闭Vetur扩展,或者重启项目,神奇的bug,复制代码造成的
|
Ubuntu 持续交付 API
如何使用 dotnet pack 打包 .NET 跨平台程序集?
`dotnet pack` 是 .NET Core 的 NuGet 包打包工具,用于将代码打包成 NuGet 包。通过命令 `dotnet pack` 可生成 `.nupkg` 文件。使用 `--include-symbols` 和 `--include-source` 选项可分别创建包含调试符号和源文件的包。默认情况下,`dotnet pack` 会先构建项目,可通过 `--no-build` 跳过构建。此外,还可以使用 `--output` 指定输出目录、`-c` 设置配置等。示例展示了创建类库项目并打包的过程。更多详情及命令选项,请参考官方文档。
1080 12
|
存储 数据库 数据库管理
SQLite支持哪些数据类型?
【7月更文挑战第31天】SQLite支持哪些数据类型?
1683 8
|
网络协议 搜索推荐 数据库
子域名和主域名的区别
域名是网站或 URL 的名称,也称为主机名,域名指向指定的IP地址。如果您是第一次创建网站,甚至已有网站,您可能会遇到许多新术语,例如“主域”和“子域”。子域名和主域名算是域名的两种常见形式。
1998 15
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
939 0

热门文章

最新文章