基本的には、同期しています。
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;
},
インポート機能がtriggerEvents
あり、実際のハンドラを呼び出します。
はここでソースから関連するセクションです。 commentsによれば、最適化されたディスパッチャです。彼らはすべて.call()
と.apply()
を呼び出しているので、コントロールが呼び出し元に返される前にコールバックが完了することに注意してください。
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);
}
};
他の人が述べたように、しかし、トリガーハンドラは、彼らが傾いている場合は、独自のコールバックをスケジュールするのは自由です。したがって、ハンドラが復帰する前に作業を終了するかどうかは、ハンドラコードそのものに依存します。
を私は間違いなく、注釈付きソースが便利。私は、このような質問に答えるときに紙の跡を残すのが大好きです。ありがとう! –