Skip to content

Instantly share code, notes, and snippets.

@panw3i
Created March 2, 2019 13:12
Show Gist options
  • Select an option

  • Save panw3i/8efbbe4cdf5d4fa0c93face2e2a12640 to your computer and use it in GitHub Desktop.

Select an option

Save panw3i/8efbbe4cdf5d4fa0c93face2e2a12640 to your computer and use it in GitHub Desktop.
订阅与发布
// 两者有啥区别呢?容易看出,用时执行模式,每次在创建一个新的matchEmail2时候,都会新建一个闭包,和创建一个新的 regx
// 立即执行啥时候用呢? 一般是在封装的遍历在函数引用中都是有同一个时,如果不同情况需要使用多个,那么使用用时执行
// 很显然,我们如果想要创建一个对象系统的话,需要用用时执行模式
var Events = function() {
var handlers = {};
var subscribe = function(type, handler) {
if (!handlers[type]) {
handlers[type] = [];
}
handlers[type].push(handler);
//存储当前这个handler是否被订阅
var isSubscribed = true;
//每次执行一个订阅函数,返回一个取消订阅回调,只要使用这个函数,那么就取消
return function unsubscribe() {
if (!isSubscribed) return; //防止多次执行
isSubscribed = false;
const index = handlers[type].indexOf(handler);
handlers[type].splice(index, 1);
}
}
function dispatch(type) {
if (handlers[type]) {
for (let i = 0; i < handlers[type].length; i++) {
handlers[type][i]();
}
}
}
//闭包对象系统,返回一个对象
return {
subscribe,
dispatch
}
}
//创建一个event对象
var event = Events();
//创建另外一个event对象
var event1 = Events();
var unSubscribe = event.subscribe('click', function() {console.log('event click')});
event1.subscribe('click', function() {console.log('event1 click')});
event.dispatch('click');
event1.dispatch('click');
unSubscribe();
event.dispatch('click');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment