为什么要附加到窗口

我正在查看qunit的代码。

我的问题是你为什么要通过属性将qunit对象附加到window对象。

这是文件的链接。 看第11行。

如果我使用firebug查看unit testing运行,您可以看到它是窗口的属性。

[编辑]补充:是否有特定的参考资料,用于在特定命名空间中声明事物的最佳实践?

所有全局对象(函数,变量等)都只是窗口的子对象,它是默认的上下文。

例如: window.jQuerywindow.$

以这种方式思考它可能更容易……你还会把它们放在哪里? 当你做一些通用的,最好的(或者至少是最简单的)将它们粘贴在默认位置时。 如果你正在做一些复杂的事情,包括许多函数,对象等……最好将它们放在命名空间或对象中。 例如,所有jQuery的代码都在jQuery下,而不是像window.ajax那样在DOM的根目录中,而是jQuery.ajax

这是更整洁,但是当你处理一些物品时可能有点过分,但是如果是这样的话,确保它们是独一无二的是一个好主意…这就是qunit所做的事情,通过为它们的对象加上qunit-

将全局变量作为window属性附加是不好的做法。 应使用var声明所有全局变量。 这是我的理由:

  1. 它使源代码的静态分析更加困难。 通过查看脚本将声明哪些全局变量以及何时声明是不可能的。 如果使用了未声明的全局变量创建ReferenceError 。 使用var意味着JavaScript的提升生效,并缓解了这个问题。
  2. 以这种方式制作的Globals根本不同,并且您的代码没有简单的方法来检测它。 最大的区别是全局变量没有[[DontDelete]] ,这意味着您可以删除全局变量。 这太傻了。
  3. 它会诱使你从全局范围之外声明你的全局变量。 这是神奇的 ,也是不好的魔法。 不要这样做。

就我而言, window.x = 1创建一个名为x的全局变量的事实是JavaScript的一个有趣的好奇心,但不应该使用也不应该回复。 但是,有充分的理由使用window属性,因为它是一个像任何其他(或多或少)的对象。 在这些情况下,您应该使用全名,例如window.onload而不仅仅是onload