縱觀谷歌對自己的書籤泡圖書館的代碼,我碰到這個傳來:分配對象/方法的變量或一個新的對象字面
var google = google || {};
google.bookmarkbubble = google.bookmarkbubble || {};
有人能解釋這是什麼,他們在這裏所做的並他們爲什麼這樣做?由於JS是一種解釋型語言,您爲什麼需要將相同的Google對象分配到Google變量中?每次加載頁面時,腳本是否只包含一次?
縱觀谷歌對自己的書籤泡圖書館的代碼,我碰到這個傳來:分配對象/方法的變量或一個新的對象字面
var google = google || {};
google.bookmarkbubble = google.bookmarkbubble || {};
有人能解釋這是什麼,他們在這裏所做的並他們爲什麼這樣做?由於JS是一種解釋型語言,您爲什麼需要將相同的Google對象分配到Google變量中?每次加載頁面時,腳本是否只包含一次?
他們正在設置一個類似命名空間的對象。如果已有google
對象或google.bookmarkbubble
對象,則確保它們不會替換它。例如,如果您有其他谷歌圖書館補充說,這可能已經建立了一個google
對象,看起來像這樣:
{
somelibrary: {
...
}
}
所以,如果他們只是有:
var google = { bookmarkbubble: { ... } }
這將打破任何代碼引用google.somelibrary
。同樣,如果他們沒有var google = google || {};
,並且您沒有google
已經定義,那麼google.bookmarkbubble
會引發錯誤。
簡而言之,此代碼可確保存在google.bookmarkbubble
對象而不覆蓋任何先前定義的對象google
或google.bookmarkbubble
。
這通常是在一個庫包含許多用戶可能包含或不包含的文件時完成的。第一個庫將初始化google
爲一個空對象(因爲它評估爲空),並且後續庫將保留已添加到該對象的屬性。
var google = google || {};
爲
if (!google) {
google = {};
}
的速記語法這確保了第二分配不會失敗,因爲google
處於至少一個空散列。
你碰巧知道var google = google || {};速記語法只適用於JavaScript? – Aaron 2012-07-13 14:33:23
在Ruby有該專業的操作:'谷歌|| = {}' – Stefan 2012-07-13 14:40:17
@Aaron,我不知道是否有其他語言允許完全相同的代碼,但它在許多語言中常見的模式。例如,在C#中,你會經常看到'foo = foo?新的Foo()'或在C++中,如果'foo'是這個代碼將工作一個'的Foo *'(和如果它被初始化爲空)'富= FOO ||新的Foo()'。 – Jacob 2012-07-13 14:43:36
他們可能會檢查,因爲他們可能有其他庫我會使用具有相同的谷歌對象?我從來沒有想過這種情況。 – Aaron 2012-07-13 14:29:12
是的,這可能就是原因。 – Jacob 2012-07-13 14:33:25