发布于 2026-01-06 8 阅读
0

🛑停止使用`this`,而应使用`globalThis`来表示全局变量。DEV全球展示挑战赛,由Mux呈现:展示你的项目!

🛑停止使用 `this`,而应使用 `globalThis` 来表示全局变量

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

我们都知道,thisJavaScript 是一个让人头疼的领域。如果我们不仅考虑 JavaScript 本身,还要考虑代码运行的环境,情况就变得更加复杂了。

所以作为开发者,你需要了解当前的全局对象是什么?

根据代码运行环境的不同,它是一个不同的对象。

你的JavaScript代码通常在哪些环境下运行?

例如 Firefox、Chrome、Edge 或 Opera 等浏览器。这里的全局对象是 ` window.`。在浏览器中写入window.setTimeout()setTimeout写入是相同的。但这并非在所有情况下都有效。您也有 `.`frames对象,但大多数情况下,该frames对象与 `.` 对象相同window

NodeJS 不知道如何操作。在 Node 中,例如,window你需要使用 `$( function_name)` 来添加一个全局函数。另一个区别是,NodeJS 变量的作用域是模块级的,而不是全局对象级的。例如,如果使用 `$(function_name)` 并检查它是否等于全局变量,则会返回 false。为了更清楚地说明这一点,这里有一个例子:globalvar a = 10

// Browser Enviourment
var a = 10;
a === window.a // true
// NodeJS Enviourment
var a = 10;
a === global.a // false

由于 Deno 的设计遵循 Web 标准,因此它可以访问window对象。

然后,当你使用 Web Workers 时self,你可能无法访问thiswindow等等。

我觉得现在问题应该很清楚了。
编写通用的 JavaScript 代码相当困难。

我们当然可以像这样使用 polyfill:

var getGlobal = function () { 
  if (typeof self !== 'undefined') { return self; } 
  if (typeof window !== 'undefined') { return window; } 
  if (typeof global !== 'undefined') { return global; } 
  throw new Error('unable to locate global object'); 
}; 

var globals = getGlobal(); 

问题在于你必须记住使用该globals变量,并且需要以某种方式全局导入或设置它。

这就是它globalThis被引入到 Javascript 中的原因。

现在就可以使用,除了IE11之外,所有主流浏览器都支持它。但我们真的需要关心一个7年前的浏览器吗?这取决于你的项目需求。

那么该如何使用呢globalThis?其实非常简单:

// Browser
console.log(globalThis) // returns the window object
// NodeJS
console.log(globalThis) // returns the globals object
// WebWorkers
console.log(globalThis) // returns the global web workers context

很简单吧?所以现在你不用再担心这个问题了,可以安心地开始写代码了。

有一点和以前一样,alert()那就是浏览器特有的功能仍然无法使用。

资源

👋打个招呼! Instagram | Twitter | LinkedIn | Medium | Twitch |

文章来源:https://dev.to/lampewebdev/stop-usuing-this-instead-use-globalthis-for-global-variables-2bc1