Я читаю Backbone.js исходный код для модуля событий и этот код заставил меня путать:Магистральные triggerEvents
var triggerEvents = function(events, args) {
var ev, i = -1,
l = events.length,
a1 = args[0],
a2 = args[1],
a3 = args[2];
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, a1);
return;
case 2:
while (++i < l)(ev = events[i]).callback.call(ev.ctx, a1, a2);
return;
case 3:
while (++i < l)(ev = events[i]).callback.call(ev.ctx, a1, a2, a3);
return;
default:
while (++i < l)(ev = events[i]).callback.apply(ev.ctx, args);
return;
}
};
Я задаюсь вопросом, почему мы должны определить args.length
? Почему бы просто не написать так:
var triggerEvents = function(events, args) {
var ev, i = -1,
while (++i < l)(ev = events[i]).callback.apply(ev.ctx, args);
};
Так что главный вопрос: Почему мы должны определить args.length
? Почему бы просто не использовать один while (++i < l)(ev = events[i]).callback.apply(ev.ctx, args);
, чтобы заменить все call
?
Да, '.call()' и '.apply()' имеет diffrence между способами получения аргументов, но 'args' уже является массивом, поэтому я думаю, что в этой ситуации использовать только один' .apply() 'может добиться того же эффекта, другими словами, определить' args.length' и '. call() 'не имеет никакого смысла, может быть избыточным, я думаю. – huachengzan
@huachengzan Возможно, вы правы ... можете ли вы протестировать его и предоставить ссылку на результаты? –
@huachengzan Я обновил свой ответ ... –