Javascript 在for循环中返回函数调用的值
我以一种非常通用的方式在JS中实现了observer模式。现在我意识到有一个概念上的问题,我不知道如何解决它。你能告诉我怎么解决吗?(特别是以非常聪明的方式:-) 代码如下:Javascript 在for循环中返回函数调用的值,javascript,Javascript,我以一种非常通用的方式在JS中实现了observer模式。现在我意识到有一个概念上的问题,我不知道如何解决它。你能告诉我怎么解决吗?(特别是以非常聪明的方式:-) 代码如下: var Oberserverable = function() { var subscribers = { /* some delegated functions in here */ }; return { attach: function (obj, fn) { subs
var Oberserverable = function() {
var subscribers = { /* some delegated functions in here */ };
return {
attach: function (obj, fn) { subscribers[obj] = { src: obj, fn: fn }; },
detach: function (obj) { delete subscribers[obj]; },
notify: function (args) {
for(var o in subscribers) {
if(typeof args === "object") { args.target = subscribers[o].src; }
/* TODO return */ subscribers[o].fn.call(window, args);
}
},
count: function () { var size = 0; for(var o in subscribers) { size++; } return size; }
};
};
我希望每个委托函数都返回其值。但这将结束我想说的循环
我正在使用它的示例案例;糟糕的IE8事件处理解决方案:
window.addEvent = function (obj, type, fn, bub) {
if(obj.addEventListener) {
return obj.addEventListener(type, fn, bub ? bub : false);
}
if(obj.attachEvent && type == "DOMContentLoaded") type = "load";
// no use of attachEvent() 'cause of very buggy behaviour in IE<=8
// http://stackoverflow.com/questions/15952943/ie-attachevent-call-returns-true-but-handler-shows-null
if(!obj["e"+type]) obj["e"+type] = new Oberserverable();
obj["e"+type].attach("e"+obj+fn, fn);
if(!obj["on"+type]) {
obj["on"+type] = function(e) {
e = e || window.event;
e.cancelBubble = bub;
return obj["e"+type].notify(e) || (type != "contextmenu"); // suppressing context menu in IE8 as default
};
}
}
window.addEvent=功能(对象、类型、fn、bub){
if(对象添加列表器){
返回对象addEventListener(类型,fn,基本单位?基本单位:false);
}
如果(obj.attachEvent&&type==“DOMContentLoaded”)type=“load”;
//没有使用attachEvent()'因为IE中有很多错误行为EUREKA
我想我已经找到了解决方案。实际的问题不是OberServer模式,而是示例案例本身。也许我应该这样做:
obj["on"+type] = function(e) {
e = e || window.event;
e.cancelBubble = bub;
obj["e"+type].notify(e);
if(typeof e.preventDefault == "function") {
return e.preventDefault();
}
};
另一部分与此类似:
addEvent(document, "contextmenu", function(e) {
document.defaultAction = false;
if (e.preventDefault)
e.preventDefault();
else
e.preventDefault = function() { return false; };
if (e.stopPropagation)
e.stopPropagation();
if (e.returnValue)
e.returnValue = false;
});
它似乎是这样工作的,但我不确定是否符合和副作用。函数只返回一个值。您可以在数组中聚合所有结果并返回它,或者您可以在循环中通过回调函数调用每个结果。我认为问题在于不同的概念。我调用了许多函数,其中每个函数都有自己的返回v但是只有一个包装函数被分配给了obj[“on”+type]。那么如何决定哪些返回值是重要的呢?这可能就是为什么addEventListener()根据规范不返回值的原因。