【问题标题】:Javascript dynamic method callJavascript动态方法调用
【发布时间】:2012-10-10 17:48:09
【问题描述】:

我想建立一个观察者/听众系统:

var listeners = [];

function MyObj(){
    this.myMethod = function(){
        // react to event
    }
}

var myObj = new MyObj();

function addListener(fn, obj){
    alliancesNotify[alliancesNotify.length] = {fn: fn, obj: obj}
}

addListener(myObj, myObj.myMethod); // Best way of doing it?

function notify(objArr){
    for (var i in objArr){
        objArr[i].obj.fn(); // will this work? 
    }
}

notify(listeners);

我希望您对这两条注释行有想法(如果它实际上会像预期的那样工作)以及是否可能有更直接的方式通过调用对象的方法来通知对象。 (例如,我注意到一些实现将函数名称作为字符串而不是对函数的引用传递,而不是这种方式。)

谢谢

【问题讨论】:

    标签: javascript methods call listener notify


    【解决方案1】:

    好的,首先有多个问题,让我们一一解决:

    • objArr[i].obj.fn(); 不会做你所期望的。它将查找并调用 fn 方法,但是您期待从 obj 调用 myMethod。要解决此问题,您有多种选择。使用applycall。所以你的代码看起来像objArr[i].fn.call(objArr[i].obj)。这就是像 jQuery、Mootools 或 PrototypeJS 这样优秀的 JS 库的表现。
    • 第二个问题,如果回调函数抛出异常并有错误怎么办?在某些浏览器中,循环将停止迭代,因此不会调用进一步的回调(函数)。解决方案可以再次使用多个,要么使用 try catch 块,要么做我最喜欢的方法。使用setTimeout,您的代码将如下所示,由于 JS 是单线程浏览器,会将回调函数排队,即使出现错误,其余的也不会受到影响。
    函数通知(objArr){ for(objArr 中的变量 i){ window.setTimeout(function(){ objArr[i].call(objArr[i].obj);}, 0); } }
    • 这绝对不是最佳解决方案,但接近最佳解决方案,因此请查看周围的许多库(谷歌搜索)以改进它。我自己为事件管理编写了一个这样的独立 PUB SUB 库check it out here

    【讨论】:

      【解决方案2】:

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 1970-01-01
        • 2016-01-20
        • 2019-11-03
        • 2015-08-17
        • 1970-01-01
        • 2012-04-08
        相关资源
        最近更新 更多