我有这样的命名空间设置:
var myApp = {};
(function(context) {
var id = 0;
context.next = function() {
return id++;
};
context.reset = function() {
id = 0;
}
})(myApp);
window.console && console.log(
myApp.next(),
myApp.next(),
myApp.reset(),
myApp.next()
) //0, 1, undefined, 0
我现在想要从myApp获得一个回调,我可以在命名空间之外捕获..
有关如何使用命名空间设置进行设置的任何想法吗?
例如:
myApp.setCallback('next', function() {
alert('hello');
});
答案 0 :(得分:2)
您可以测试是否存在回调并运行该函数(如果存在):
var myApp = {};
(function(context) {
var id = 0;
context.next = function() {
return id++;
};
context.reset = function() {
id = 0;
if(typeof this.onreset === 'function') {
this.onreset();
}
}
})(myApp);
myApp.onreset = function() {};
答案 1 :(得分:1)
您需要添加一个包含回调函数的对象和一个注册它们的函数:
var myApp = {};
(function(context) {
var id = 0;
var callbacks = {};
context.next = function() {
id++;
doCallbacks('next');
return id;
};
context.setCallback = function(event, f) {
if(!callbacks[event] || !callbacks[event] instanceof Array) {
callbacks[event] = [];
}
callbacks[event].push(f);
}
context.reset = function() {
id = 0;
}
function doCallbacks(key /*, event */) {
if(callbacks[key] && callbacks[key] instanceof Array) {
for(var i=0; i < callbacks[key].length; i++) {
callbacks[key][i](/*event*/);
}
}
}
})(myApp);
然后你可以打电话:
myApp.setCallback('next', function() {
alert('hello');
});
<强> working jsFiddle 强>
<强> working jsFiddle with event objects 强>
你可能需要稍微调整一下数组的检查,我不知道如何完美地完成它。