Могут ли помочь promise или даже просто события/observer?
Чта? Это тут причем?
Неужели в javascript все надо делать на событиях
Опять же, чта? Почитайте... не знаю... про лямбда исчисления, функциональное программирование... При чем тут ивенты? В вашем примере мы явно задаем контекст функции посредством каррирования:
_.bind = function (fn, context) {
return function () {
return fn.apply(context, arguments);
};
};
Это позволяет нам внутри функции отвязаться от внешней области видимости и быть уверенным что у функции верный контекст. Вдруг вы решите потом поменять ваш self = this на self = undefined или сменить self на that... мало ли... Меньше связанности - больше счастья.
Когда же писать линейный код а когда декомпозировать?
Линейный там где нужен линейный код, а событийную модель - при взаимодействии с вводом/выводом, так как оно должно быть асинхронным. Вообще все эти замуты с колбэками и принципы по которым происходит "декомпозиция" учитывают такую штуку как event-loop. В любом случае это не относится к предмету вопроса из заголовка.
Разберитесь с тем как работает javascript и будет вам счастье.
p.s. А вы на чем пишите что такие вопросы задаете? Удовлетворите мое любопытство.