在阅读此article时,我想将此与一些实际例子联系起来,所以我对window
对象感到好奇。由于我们无法实例化它,并且它在任何程序的生命周期中只有一个实例,因此它应该满足标准。
以上是我的意见,但我想知道真相,而且,给定文章中所说的所有要点一般都适用于window
对象?
UPDATE1
引用文章引用:
单身人士只不过是全球状态
因此,一般来说,全局状态通过隐藏依赖关系使测试变得更难,我们如何在javascript中处理这些限制?
答案 0 :(得分:3)
它不是真正的单例,因为您可以使用Window.open
函数创建新实例。返回值是对该脚本中相同对象脚本的引用,该新脚本中的脚本将被视为其全局window
对象。
我会澄清单身人士是全球状态的一种,但并不是唯一的一种。确实,当前window
对象上定义的任何内容都可以在脚本中的任何位置看到。因此window
直接表示您的全局状态,即使它在技术上不是Singleton
。
现在,关于您的第二个问题,您如何处理JavaScript在测试期间具有全局范围的事实?那太难了。即使在没有window
对象的环境中,例如Node.js,它仍然存在一些全局对象。启用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)可以帮助捕获这些类型的错误。