3

It is pretty similar to this question

My question is more about the example code.

Code:

var eventuality = function (that) {
    var registry = {};
    that.fire = function (event) {
// Fire an event on an object. The event can be either
// a string containing the name of the event or an
// object containing a type property containing the
// name of the event. Handlers registered by the 'on'
// method that match the event name will be invoked.
        var array,
            func,
            handler,
            i,
            type = typeof event === 'string' ?
                    event : event.type;
// If an array of handlers exist for this event, then
// loop through it and execute the handlers in order.
        if (registry.hasOwnProperty(type)) {
            array = registry[type];
            for (i = 0; i < array.length; i += 1) {
                handler = array[i];
// A handler record contains a method and an optional
// array of parameters. If the method is a name, look
// up the function.
                func = handler.method;
                if (typeof func === 'string') {
                    func = this[func];
                }
// Invoke a handler. If the record contained
// parameters, then pass them. Otherwise, pass the
// event object.
                func.apply(this,
                    handler.parameters || [event]);
            }
        }
        return this;
    };
    that.on = function (type, method, parameters) {
// Register an event. Make a handler record. Put it
// in a handler array, making one if it doesn't yet
// exist for this type.
        var handler = {
            method: method,
            parameters: parameters
        };
        if (registry.hasOwnProperty(type)) {
            registry[type].push(handler);
        } else {
            registry[type] = [handler];
        }
        return this;
    };
    return that;
}

in the code , I don't understand this line, func = handler.method; .

How can this work ? I mean handler.method should be undefined, right ?

Thanks

Community
  • 1
  • 1
maxisam
  • 21,975
  • 9
  • 75
  • 84
  • 1
    It can be if, `method` is `undefined` in `var handler = { method: method, parameters: parameters };`, but it does not have to. How ever, if someone makes the call `something.on('event')` without providing a handler, it's this person's fault. That's against the whole purpose of this functionality. – Felix Kling May 02 '12 at 16:11

2 Answers2

2

handler.method is defined here (of course it would have to be passed in as a parameter):

that.on = function (type, method, parameters) {
    var handler = {
        method: method,   // defines the method property of the handler object
        parameters: parameters  // defines the parameters property of the handler object
    };

Have a read of Working with Objects on the MDN - the .method is referencing the method property of the handler object

Manse
  • 37,765
  • 10
  • 83
  • 108
1

handler is an object stored in the registry:

    array = registry[type];
    for (i = 0; i < array.length; i += 1) {
        handler = array[i];

It was added in the that.on method:

    var handler = {
        method: method,
        parameters: parameters
    };
    if (registry.hasOwnProperty(type)) {
        registry[type].push(handler);
    } else {
        registry[type] = [handler];
    }

and it clearly has the method property.

Alexander Pavlov
  • 31,598
  • 5
  • 67
  • 93