Создание событий в Javascript - PullRequest
2 голосов
/ 15 сентября 2011

Если у меня есть список функций, которые служат в качестве подписок на события, есть ли преимущество в том, чтобы проходить через них и вызывать их с помощью .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
            }
        };
    })();

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Нет, другой разницы нет.Если вы следуете второму подходу, вы можете расширить 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);
    }
 };
1 голос
/ 15 сентября 2011

Если вы решили использовать метод B, вы можете разрешить функции, которая подписывается на событие, выполнять специфические для события функции.

Например, вы можете использовать this.getDate() внутри вашей функции (вам нужно будет создать метод) вместо передачи даты в качестве параметра. Другим полезным методом внутри класса Event будет this.getTarget().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...