这是Peter Higgins的酒吧子库:https://github.com/phiggins42/bloody-jquery-plugins/blob/master/pubsub.js
(function (d) {
var cache = {};
d.publish = function (topic, args) {
cache[topic] && d.each(cache[topic], function () {
this.apply(d, args || []);
});
};
d.subscribe = function (topic, callback) {
if (!cache[topic]) {
cache[topic] = [];
}
cache[topic].push(callback);
return [topic, callback];
};
d.unsubscribe = function (handle) {
var t = handle[0];
cache[t] && d.each(cache[t], function (idx) {
if (this == handle[1]) {
cache[t].splice(idx, 1);
}
});
};
})(jQuery);
我不理解publish
的逻辑和功能:
cache[topic] && d.each(cache[topic], function () {
**this.apply(d, args || []);** //what is happening here?
});
这部分的目的是什么?除了它发布事件
的事实答案 0 :(得分:3)
在此上下文中,&&
用作以下的简写:
if (cache[topic]) {
d.each(cache[topic], function() { … });
}
这是因为&&
(和||
)是short-circuiting,所以如果左侧评估为false
- ish值(或true
-ish值,在||
的情况下,右侧不会被评估。
例如:
> function foo(result) { console.log("foo"); return result; } > function bar(result) { console.log("bar"); return result; } > foo(false) && bar(true); foo false
答案 1 :(得分:0)
基本上,您使用args调用每个主题回调(如果有)(如果传递任何参数)。所以你可以:
$.subscribe('do_something', function(str) { alert(str + ' world!')});
$.subscribe('do_something', function(str) { console.log(str)});
$.publish('do_something', ['Hello']); // will alert Hello world! and output 'Hello' to console
答案 2 :(得分:0)
cache[topic] && d.each(cache[topic], function () {
this.apply(d, args || []);
});
申请 d 的每个元素,如果定义了 cache [topic] ,则函数调用 apply 方法< em> d 参数, args ,如果未定义 args ,则为空数组。