Похоже на оптимизацию скорости по сравнению с простым определением функции.
Представь, что у тебя было
Function addEvent(el, type, fn){
if (window.addEventListener) {
el.addEventListener(type, fn, false);
} else if (window.attachEvent) {
var f = function() {
fn.call(el, window.event);
};
el.attachEvent('on' + type, f);
}
}
Это кросс-браузерная функция для добавления события, которое работает так же, как в примере, который вы опубликовали. Разница возникает, когда у вас тысячи вызовов addEvent.
В примере, который вы разместили, функция «упрощена» и «материализована» для каждого типа браузера во время запуска (обратите внимание на «();» в конце)
вы получите либо
var addEvent = function(el, type, fn) {
el.addEventListener(type, fn, false);
};
или
var addEvent= function(el, type, fn) {
var f = function() {
fn.call(el, window.event);
};
el.attachEvent('on' + type, f);
};
в зависимости от браузера. После этого выбор никогда не будет переоценен (это будет бесполезно, так как браузер не изменится во время выполнения ;-). Следовательно, функция избегает 1 или 2 тестов каждый раз, когда вызывается функция addEvent! Это может иметь значение для такой интенсивной функции использования, как addEvent.
Надеюсь, это поможет вам,
Джером Вагнер