【问题标题】:why attach to window [edited]为什么附加到窗口[编辑]
【发布时间】:2010-03-24 02:10:20
【问题描述】:

我正在查看 qunit 的代码。

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

这是file 的链接。看第 11 行。

如果我查看使用 firebug 运行的单元测试,您会发现它是 window 的属性。

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

【问题讨论】:

    标签: javascript jquery qunit


    【解决方案1】:

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

    例如:window.jQuerywindow.$

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

    这要整洁得多,但在处理一些项目时可能有点过分了,但如果是这种情况,最好确保它们是唯一的...... qunit 这样做,通过在它们的对象前加上 @ 987654326@

    【讨论】:

    • 所以一开始你会从窗口命名空间开始并向它添加属性?
    • 所以我查看了同样的页面。并注意到有 window.jQuery 和 window.$ 属性。一个不是另一个的别名吗? jQuery 是否实际上加载了两个属性或它们指向同一内存的指针?有没有办法在firebug中找到内存地址?
    • @Gutzofter - 是的,window.$window.jQuery 的别名,因此您的代码可以更短,例如$(selector) 而不是 jQuery(selector) 我不确定找到实际内存地址的方法,抱歉 :) 对于另一个问题,是的,你从窗口开始,在那里添加一些东西(比如说 jQuery 对象)然后你可以添加到那个。
    【解决方案2】:

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

    1. 它使源代码的静态分析变得更加困难。通过查看脚本无法判断哪些全局变量将被声明以及何时声明。如果使用未声明的全局变量创建ReferenceErrors。使用var意味着JavaScript的提升生效,并缓解了这个问题。
    2. 以这种方式创建的全局变量根本不同,您的代码没有简单的方法可以检测到这一点。最大的不同是[[DontDelete]] 以这种方式制作的全局变量上没有,这意味着您可以删除全局变量。这很愚蠢。
    3. 它会诱使您从全局范围之外声明您的全局变量。这是魔法,而且是糟糕的魔法。不要这样做。

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

    【讨论】:

    • "如果使用未声明的全局变量,它们将创建 ReferenceErrors。"正确又不正确。如果你这样做 benny = undefinedvar; benny 的类型将变为“未定义”......如果你这样做 benny = undefinedvar.anothervar;它会抛出,因为您试图访问未定义的属性。
    • 我想这还不清楚。 “使用”是指在表达式中使用,而不是用作左值(即在赋值中)。此外,运行 x = y 会引发 ReferenceError: y is not defined
    • 您具体使用什么静态分析工具?
    • 我什至不是说使用任何特定的工具。仅查看代码,并不总是能立即清楚哪些全局变量存在以及何时存在。虽然我相信像 JSLint 这样的工具会因此而受挫。当然,可以通过使用 /*globals */ 评论来缓解,但这并不是使用 window-prop 全局变量的真正理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2013-07-20
    • 1970-01-01
    • 2022-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多