为什么要附加到窗口[编辑]

时间:2010-03-24 02:10:20

标签: javascript jquery qunit

我正在查看qunit的代码。

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

以下是file的链接。看第11行。

如果我使用firebug查看单元测试运行,您可以看到它是窗口的属性。

[编辑] 附加:在特定名称空间中声明事物的最佳实践是否有特定参考?

2 个答案:

答案 0 :(得分:5)

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

例如:window.jQuerywindow.$

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

这是更整洁,但是当你处理一些项目时可能有点过分,但是如果是这样的话,确保它们是唯一的是一个好主意...这就是qunit所做的,通过为它们的对象添加前缀{ {1}}

答案 1 :(得分:2)

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

  1. 它使源代码的静态分析更加困难。通过查看脚本将声明哪些全局变量以及何时声明是不可能的。未声明的全局创建ReferenceError,如果它们被使用的话。使用var表示JavaScript的提升生效,并缓解了这个问题。
  2. 以这种方式制作的Globals根本不同,并且您的代码没有简单的方法来检测它。最大的区别是这种方式在全局变量上没有[[DontDelete]],这意味着你可以删除你的全局变量。这太傻了。
  3. 它会诱使你从全局范围之外声明你的全局变量。这是魔法,也是那种不好的魔法。不要这样做。
  4. 就我而言,window.x = 1创建一个名为x的全局变量的事实是一个有趣的JavaScript好奇心,但不应该使用也不应该回复。但是,有充分的理由使用window的属性,因为它是一个像任何其他(或多或少)的对象。在这些情况下,您应该使用全名,例如window.onload而非onload