Никита Полевой: Массивы предназначены для работы с упорядоченными данными, желательно одного типа. Если массив становится разреженным и/или ему добавляется любое свойство не являющееся целым числом, тогда интерпретатор работает с ним как с объектом со всеми вытекающими, включая понижение скорости обращения и размер занимаемой памяти.
Если вы пишете var base = this, то используйте эту переменную везде, где она эквивалентна this в текущей области. Иметь одну сущность под разными именами не лучшая идея. Сам this при работе с объектами неизбежен, и я не понимаю зачем было оборачивать всё в конструктор.
Никита Полевой: Занесение кодов в переменные несёт описательный характер (пояснять их в комментариях менее эффективно) и позволяет держать в голове меньше информации, не говоря о наглядности для человека, которому может придётся разбираться в вашем коде.
if (actions[event.which]) {
return actions[event.which](event);
}
Эти два выражения равноценны. Проверка нужна, чтобы в случае отсутствия функции соответствующей коду не применять вызов на undefined (это создаёт ошибку). В вашем коде происходит тоже самое. Если вынесете присваивание отдельно, то станет нагляднее:
t = actions[e.keyCode];
return t && t(e);
Из технических проблем: хранение функций в разреженном массиве вместо объекта. На работе скрипта это не сказывается, но очень грязно. Ещё объявление переменных без ключевого слова var. В таких случаях переменные создаются в глобальной области видимости, а не в той, в которой были объявлены. Это очень быстро приводит к проблемам.
Антон Ф.: Давно мы перешли на ты? Чтобы забиндить галп есть сотни инструкций, которые не обязывают особыми знаниями. А читать исключительно технический язык переполненный специфическими терминами без единой практической задачи не особо продуктивно для старта.
Антон Ф.: Советовать новичку Флэнагана это как советовать первокласснику мат-анализ первого курса. К подобной книге надо уже иметь за спиной хотя бы сырые знания и опыт.
Вадим Ремин: Возможно, если эта функция, при одинаковых типах остальных аргументов и при разных их значениях, сможет возвращать значения различных типов, и будет строить развилки на основе этого типа, тогда её можно будет отнести к какому-то виду полиформизма. Но выглядит это слишком сложно и слишком абстрактно, чтобы принимать во внимание. Да и сама передача функции как аргумента не меняет реализацию основной функции, ведь сам вызов аргумента как функции предусмотрен изначально и доступ ко внутренним переменным эта функция имеет ровно настолько насколько ей позволяет функция основная.
Вадим Ремин: В изменённом примере всё-равно можно легко вынести cb(arg1, arg2) во вне и передавать в конечную функцию лишь один аргумент, который будет являться результатом функции cb. И всё это будет выглядеть наглядней и логически правильней. Про полиформизм можете почитать на той же википедии, там нигде не ссылаются на возможности типов данных, а только на их принадлежность.
Ярослав IKARUS: #slider после инициализация генерирует событие slide. На него и подписывайте ещё одну функцию отдельно: $("#slider").on("slide", function(event, ui) {/*****/});
Никита Гущин: Да, я уже сам проверил. Тем не менее довольно неявная возможность, которая к тому же перекрывается после использования data по прямому назначению.
Роман Денискин: jsfiddle.net/awkxyepg/1 С другими правками кода вам придётся самому разбираться, у меня уже не хватает свободного времени. Парой слов тут не объяснишь, если всё в целом непонятно.
Роман Денискин: https://learn.javascript.ru целиком. Когда уложится - "JavaScript. Подробное руководство" Флэнагана. После этого уже идти в сторону организации проекта: паттерны, построение архитектуры.