2012-07-13 47 views
0

縱觀谷歌對自己的書籤泡圖書館的代碼,我碰到這個傳來:分配對象/方法的變量或一個新的對象字面

var google = google || {}; 
google.bookmarkbubble = google.bookmarkbubble || {}; 

有人能解釋這是什麼,他們在這裏所做的並他們爲什麼這樣做?由於JS是一種解釋型語言,您爲什麼需要將相同的Google對象分配到Google變量中?每次加載頁面時,腳本是否只包含一次?

回答

2

他們正在設置一個類似命名空間的對象。如果已有google對象或google.bookmarkbubble對象,則確保它們不會替換它。例如,如果您有其他谷歌圖書館補充說,這可能已經建立了一個google對象,看起來像這樣:

{ 
    somelibrary: { 
     ... 
    } 
} 

所以,如果他們只是有:

var google = { bookmarkbubble: { ... } } 

這將打破任何代碼引用google.somelibrary。同樣,如果他們沒有var google = google || {};,並且您沒有google已經定義,那麼google.bookmarkbubble會引發錯誤。

簡而言之,此代碼可確保存在google.bookmarkbubble對象而不覆蓋任何先前定義的對象googlegoogle.bookmarkbubble

+0

他們可能會檢查,因爲他們可能有其他庫我會使用具有相同的谷歌對象?我從來沒有想過這種情況。 – Aaron 2012-07-13 14:29:12

+1

是的,這可能就是原因。 – Jacob 2012-07-13 14:33:25

0

這通常是在一個庫包含許多用戶可能包含或不包含的文件時完成的。第一個庫將初始化google爲一個空對象(因爲它評估爲空),並且後續庫將保留已添加到該對象的屬性。

1

var google = google || {};

if (!google) { 
    google = {}; 
} 

的速記語法這確保了第二分配不會失敗,因爲google處於至少一個空散列。

+0

你碰巧知道var google = google || {};速記語法只適用於JavaScript? – Aaron 2012-07-13 14:33:23

+1

在Ruby有該專業的操作:'谷歌|| = {}' – Stefan 2012-07-13 14:40:17

+1

@Aaron,我不知道是否有其他語言允許完全相同的代碼,但它在許多語言中常見的模式。例如,在C#中,你會經常看到'foo = foo?新的Foo()'或在C++中,如果'foo'是這個代碼將工作一個'的Foo *'(和如果它被初始化爲空)'富= FOO ||新的Foo()'。 – Jacob 2012-07-13 14:43:36