2012-07-02 75 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回调列表的唯一值上创建闭包。