纵观谷歌对自己的书签泡图书馆的代码,我碰到这个传来:分配对象/方法的变量或一个新的对象字面
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