2012-07-02 36 views
1

我使用阿迪·奧斯馬尼的酒吧子方法:阿迪Osmanis的pub/sub,很難理解代碼

var topics = {}; 

jQuery.Topic = function(id) { 
    var callbacks, 
     topic = id && topics[ id ]; 
    if (!topic) { 
     callbacks = jQuery.Callbacks(); 
     topic = { 
      publish: callbacks.fire, 
      subscribe: callbacks.add, 
      unsubscribe: callbacks.remove 
     }; 
     if (id) { 
      topics[ id ] = topic; 
     } 
    } 
    return topic; 
}; 

但在此之前我把它添加到我的項目,我想了解它好一點。這是相當簡單的,除了我從未見過的一條線:topic = id && topics[ id ];

topic = id好的。運營商在這裏做什麼?它是否將主題數組添加到ID?或進行比較?

回答

4
topic = id && topics[ id ]; 

應當讀作

topic = (id && topics[ id ]); 

&&具有更高的優先級,對MDN documentation

如所述分配給topic的值是topic[id]id作爲 「真」 值,false評價否則:所以這是一個更短的方式

if (id) { 
    topic = topics[id]; 
} 
else { 
    topic = false; 
} 
0

以上是jQuery.Callbacks()的jQuery文檔頁面上Pub/Sub的示例。 https://api.jquery.com/jQuery.Callbacks/

我已經寫了一個這個例子做什麼的摘要,對我而言,這個摘要並不是很明顯。


主題()是返回包含三個重命名的函數對象主題對象的功能: callbacks.fire,callbacks.add,callbacks.remove。

主題對象包含三個功能對象,重命名爲發佈,訂閱,訂閱

id表示唯一字符串識別發佈訂閱信道:例如:「mailArrived」,「mailSent」

主題對象(複數)包含主題對象,按ID鍵。它用於確定是否存在具有該id的主題對象。 Topic()檢查id是否不是false(undefined,null,NaN,0,「」或false)。

如果id爲true,並且主題中存在該主題的主題, 則主題對象被分配主題[id]並返回。

如果id爲true,並且主題中不存在該標識的主題,則 將創建一個新主題對象,並將其放置在主題[id]中並返回。

如果id爲false,則會創建並返回一個新的主題對象,但不會放入主題中。

每次創建主題對象時,都會在新的jQuery回調列表的唯一值上創建閉包。