2012-07-13 45 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