2010-03-24 69 views
3

我正在查看qunit的代碼。爲什麼要附上窗口[編輯]

我的問題是爲什麼你想要通過屬性附加qunit對象到窗口對象。

這裏是鏈接到file。看看第11行。

如果我看一下使用螢火蟲的單元測試運行,你可以看到它是窗口的屬性。

附加信息:是否有特定的參考,用於在特定命名空間中聲明事物的最佳實踐?

回答

5

所有的全局對象(函數,變量等)只是窗口的子項,它是默認的上下文。

例如:window.jQuerywindow.$

它可能會更容易這樣......你會把他們還有什麼地方想的呢?當你在做一些這樣的事情時,最好的(或者至少是最簡單的)把它們粘在默認的地方。如果你正在做一些複雜的功能,對象等......最好把它們放在一個名稱空間或一個對象內。例如,jQuery的所有代碼都在jQuery之下,而不是在DOM的根目錄中散落,如window.ajax,而不是jQuery.ajax

這很簡單,但是當你處理幾件物品時可能矯枉過正,但如果是這種情況,確保它們是唯一的是一個好主意......通過在它們的對象前加上qunit-

+0

所以最初你會開始在窗口的命名空間,並添加屬性? – Gutzofter 2010-03-24 02:32:28

+0

所以我查閱了這個非常相同的頁面。並注意到有兩個window.jQuery和window. $ properties。是不是另一個別名? jQuery實際上加載了兩個屬性還是r他們指向相同的內存?有沒有辦法在firebug中找到內存地址? – Gutzofter 2010-03-24 02:39:22

+0

@Gutzofter - 是的,'window。$'是'window.jQuery'的別名,因此您的代碼可以更短,例如''(選擇器)'而不是'jQuery(選擇器)'我不確定如何找到實際的內存地址,對不起:)另一個問題,是你從窗口開始,添加一些東西(比如說jQuery對象),那麼你可以添加到。 – 2010-03-24 10:06:14

2

作爲window的屬性附加全局變量是不好的做法。所有全局變量應該使用var來聲明。這是我的理由:

  1. 它使源代碼的靜態分析變得更加困難。通過查看哪個全局變量將被聲明和什麼時候被調用是不可能的。未聲明的全局變量將使用創建ReferenceError。使用var意味着JavaScript的提升生效,並緩解了這個問題。
  2. 通過這種方式生成的全局變量有着根本性的不同,並且您的代碼沒有簡單的方法來檢測它。最大的區別是在這種方式下全局變量上不存在[[DontDelete]],這意味着您可以刪除全局變量。這很愚蠢。
  3. 它會誘使你從全局範圍之外聲明你的全局變量。這是魔術,並在那個不好的魔術。不要這樣做。

就我而言,事實證明window.x = 1創建一個名爲x一個全局變量的JavaScript的一個有趣的好奇心,但不應該使用,也不要在回答。但是,有很好的理由使用window的屬性,因爲它是任何其他對象(或多或少)。在這些情況下,您應該使用全名,例如window.onload而不是僅僅onload

+0

「未聲明的全局變量將在創建ReferenceErrors時使用。」正確但不正確。如果你做benny = undefinedvar; benny的類型將變成「undefined」...如果你做了benny = undefinedvar.anothervar;它會拋出,因爲你試圖訪問未定義的屬性。 – Warty 2010-03-24 06:18:03

+1

我想那不清楚。 「used」是指在表達式中使用,而不是用作左值(即在賦值中)。 另外,運行'x = y'會拋出'ReferenceError:y未定義'。 – bcherry 2010-03-24 06:45:54

+0

您使用了哪些靜態分析工具? – Gutzofter 2010-03-24 17:19:16

相關問題