用Javascript创建事件

Creating events in Javascript

本文关键字:事件 创建 Javascript      更新时间:2023-09-26

如果我有一个作为事件订阅的函数列表,那么运行它们并使用.call()(下面的B)或更直接(a)调用它们是否有优势?代码如下。我能看到的唯一区别是,.call可以控制this的设置。除此之外还有什么不同吗?

    $(function() {
        eventRaiser.subscribe(function() { alert("Hello"); });
        eventRaiser.subscribe(function(dt) { alert(dt.toString()); });
        eventRaiser.DoIt();
    });
    var eventRaiser = new (function() {
        var events = [];
        this.subscribe = function(func) {
            events.push(func);
        };
        this.DoIt = function() {
            var now = new Date();
            alert("Doing Something Useful");
            for (var i = 0; i < events.length; i++) {
                events[i](now);  //A
                events[i].call(this, now);  //B
            }
        };
    })();

不,没有其他区别。如果遵循第二种方法,则可以扩展subscribe,以便"客户机"可以指定要使用的上下文:

this.subscribe = function(func, context) {
     events.push({func: func, context: context || this});
};
this.DoIt = function() {
    var now = new Date();
    alert("Doing Something Useful");
    for (var i = 0; i < events.length; i++) {
        events[i].func.call(events[i].context, now);
    }
 };

如果您决定使用方法B,您可以允许订阅事件的函数执行特定于事件的函数。

例如,您可以在函数中使用this.getDate()(您必须创建该方法),而不是将日期作为参数传递。在Event类中另一个有用的方法是this.getTarget()