window 是 Javascript 中单例对象的例子吗?

Is window example of Singleton objects in Javascript?

在阅读此 article 时,我想将其与一些实际示例联系起来,所以我对 window 对象感到好奇。由于我们无法实例化它,并且在任何程序的生命周期中它只有一个实例,因此它应该满足条件。

以上是我的看法,但我想知道真相,而且给定文章中所说的所有观点都适用于一般的window对象吗?

更新1

正如给定文章中引用的那样:

Singletons are nothing more than global state

所以,一般来说,全局状态通过隐藏依赖关系使测试变得更加困难,我们如何处理 javascript 中的此类限制?

它不是真正的单例,因为你可以用Window.open函数创建一个新的实例。 return 值是对新 window 中脚本中相同对象脚本的引用,将被视为它们的全局 window 对象。

我要澄清的是,单例是 一种 全局状态,但它不是唯一的一种。的确,在当前 window 对象上定义的任何内容在脚本中的任何位置都是可见的。所以 window 直接代表你的全局状态,即使它在技术上不是 Singleton.

现在,关于您的第二个问题,您如何处理 JavaScript 在测试期间具有全局范围的事实?好吧,这要难得多。即使在没有 window 对象的环境中,像 Node.js, there it still some set of global objects. Things like enabling strict mode 这样的环境也可以大大避免在全局范围内意外创建变量,并且您可以防止函数添加到像这样的全局状态(我不确定这是否可取,但它有效):

"use strict"
Object.preventExtensions(window);

function testfunc() {
  window.someVar = 0; // Can't add property x, object is not extensible
  console.log("testfunc", window.someVar);
}

但我认为您无法完全消除全局状态影响您的代码的可能性。一个常见的例子是 window.name 属性 可以出现在意想不到的地方,像这样:

"use strict"
Object.preventExtensions(window);

function testfunc() {
  console.log("testfunc", name); // perfectly valid
}

JSLint 等一些静态分析工具可以帮助捕获这些类型的错误。