Потому что в строке lodash.set = set();
Вы присвоили имени lodash.set результат выполнения функции set с пустым аргументом (что эквивалентно вызову set(undefined)), а не саму функцию, как вы, вероятно, хотели.
Все работает но только не под директивой "use strict" без нее все норм, может его нет в новом стандарте такого подхода, через объекты и return модули работают прекрасно
Михаил Белошицкий: самый эффективный через return? возвратом объекта делать? или делать сразу как объект с набором методов? Как наиболее эффективно и производительно?
Александр Дегтярев: Яваскрипт - не тот язык, в котором использование return или присвоение переменной может определять производительность и эффективность. Мой вариант мне кажется прежде всего наиболее понятным.
Александр Дегтярев: Еще не очень хорошо использовать функцию с одним и тем же именем в глобальном и локальном контекстах, вообще есть сомнения в нужности function lodash() {}. Без нее я бы сделал так https://jsfiddle.net/8xjh9xs9/1/
Александр Дегтярев: lodash.set = set() создаст лишь очередной указатель (ссылку) на функцию set(), которая сразу же выполнится и вернет значение в переменную lodash.set а так как ретурна в функции сет нет, оно вернет туда undefined . очень рекомендую от корки до корки прочесть learn.javascript.ru . Его автор к обучению отнесся фундаментально и очень очень структурировано.