Объявление функции и выражение функции в шаблоне модуля

Я только что узнал о разнице между объявлениями функций и функциональными выражениями. Это заставило меня задуматься о том, правильно ли я делаю что-то в своем коде AngularJS. Я следую шаблону, который использовал Джон Папа, но теперь он кажется несовместимым с типичным подходом JS к шаблону модуля. Джон Папа активно использует вложенные объявления функций в своих контроллерах и сервисах. Это плохо?

Есть ли основания отдавать предпочтение этому:

var foo = (function() {
    var bar = function() { /* do stuff */ };
    return {
       bar : bar
    };
}());

foo.bar();

через это:

var foo = (function() {
    return {
       bar : bar
    };

    function bar() { /* do stuff */ };
}());

foo.bar();

Я в первую очередь разработчик C# и все еще привыкаю ко всем нюансам JavaScript. Я предпочитаю последний подход, потому что все функции в IIFE являются частными, а раскрывающийся шаблон модуля вверху на самом деле является общедоступной частью. В классе C# у меня всегда есть общедоступные свойства и методы перед частными вспомогательными функциями. Тем не менее, я понимаю, что в мире JS это, скорее всего, не так просто.

Каковы скрытые опасности (если таковые имеются) использования последнего подхода?


person mikesigs    schedule 30.06.2014    source источник
comment
Собственно, с этого я и начал. Я прочитал это и целую кучу других замечательных ресурсов в Интернете, но ни один из них не был посвящен IIFE или шаблону модуля.   -  person mikesigs    schedule 30.06.2014


Ответы (1)


Между этими двумя подходами нет никакой функциональной разницы, это просто стилистическая разница.

Интерпретатор JavaScript в любом случае будет невидимо "поднимать" объявления функций из последнего стиля в начало вложенной функции - иначе блок return будет ссылаться на неопределенную функцию.

person Alnitak    schedule 30.06.2014
comment
Это, безусловно, то, что я надеялся услышать. Если дело только в стиле, то я определенно предпочитаю декларативный подход. Однако, похоже, это идет вразрез с общепринятым мнением. - person mikesigs; 30.06.2014
comment
@mikesigs Использование объявлений является соглашением. Однако они должны быть объявлены до их использования, не полагаясь на подъем. - person Bergi; 15.02.2017