1

我正在使用 Addy Osmani 的 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

2 回答 2

4
topic = id && topics[ id ]; 

应该读作

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

&&具有更高的优先级,如MDN 文档中所述

分配给的值topictopic[id]id被评估为“真”值时,false否则:所以这是一个更短的方法

if (id) {
   topic = topics[id];
}
else {
   topic = false;
}
于 2012-07-02T13:07:08.453 回答
0

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

我已经写了这个例子做了什么的总结,对我来说,这并不是很明显。


Topic() 是一个函数,它返回一个包含三个重命名的函数对象的主题对象:callbacks.fire、callbacks.add、callbacks.remove。

topic对象包含三个函数对象,重命名为发布、订阅、取消订阅

id 是指标识 pubSub 频道的唯一字符串:例如:“mailArrived”、“mailSent”

主题对象(复数)包含主题对象,以 id 为键。它用于确定是否存在具有该 id 的主题对象。

Topic() 检查 id 是否为 false(未定义、null、NaN、0、"" 或 false)。

如果 id 为真,并且该 id 的主题存在于主题中,则主题对象被分配主题[id] 并返回。

如果 id 为真,并且该 id 的主题在主题中不存在,则创建一个新主题对象,作为主题 [id] 放置在主题中并返回。

如果 id 为 false,则创建并返回一个新的主题对象,但不会放入主题中。

每次创建主题对象时,都会在新的 jQuery 回调列表的唯一值上创建一个闭包。

于 2014-02-22T17:18:58.997 回答