Addy Osmanis pub/sub,难以理解代码

Addy Osmanis pub/sub, trouble understanding the code

本文关键字:代码 Osmanis pub sub Addy      更新时间:2023-09-26

我正在使用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 添加到主题数组?还是进行比较?

topic = id && topics[ id ]; 

应读作

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

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

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

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

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

我已经写了这个例子的摘要,对我来说,这并不明显。


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

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

id 是指标识 pubSub 通道的唯一字符串:例如:"mailArrived"、"mailSent"

主题对象

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

Topic() 检查 id 是否不为 false(undefined、null、NaN、0、" 或 false)。

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

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

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

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