Fondamentalmente, sì, è sincrono.
Ecco la relativa sezione dalla fonte:
trigger: function(name) {
if (!this._events) return this;
var args = slice.call(arguments, 1);
if (!eventsApi(this, 'trigger', name, args)) return this;
var events = this._events[name];
var allEvents = this._events.all;
if (events) triggerEvents(this, events, args);
if (allEvents) triggerEvents(this, allEvents, arguments);
return this;
},
La funzione di importazione è triggerEvents
, che chiama in realtà i gestori. Secondo lo comments, è solo un dispatcher ottimizzato. Si noti che tutti chiamano .call()
e .apply()
, quindi la richiamata verrà completata prima che il controllo venga restituito al chiamante.
var triggerEvents = function(obj, events, args) {
var ev, i = -1, l = events.length;
switch (args.length) {
case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx);
return;
case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0]);
return;
case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1]);
return;
case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1], args[2]);
return;
default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
}
};
Come altri hanno già detto, però, i gestori di innesco sono liberi di programmare le proprie callback se sono così inclinato. Quindi, indipendentemente dal fatto che gli handler abbiano finito il loro lavoro prima di tornare dipende dal codice del gestore stesso.
ho sicuramente trovare la fonte annotata utile; Mi piace soprattutto lasciare una scia di carta quando rispondo a domande come questa. Grazie! –