Ваша проблема не обязательно имеет отношение к выражению функции против объявления функции.
В обоих случаях, которые вы показали, вы не получите возвращаемое значение внутренней функции.
Вы могли бы получить его, просто вызвав внутреннюю функцию и вернув ее значение:
function closedF() {
return (function(){
/* return value */
}()); // <- calling the inner function here
}
Недостатком является то, что внутренняя функция всегда будет определяться заново при вызове внешней функции. Вы можете предотвратить это, кэшируя внутреннюю функцию как свойство внешней функции:
function closedF() {
var func = closedF.__func || (closedF.__func = function(){
/* return value */
});
return func();
}
Однако, это может быть более запутанным, чем полезным.
Проще сразу выполнить внешнюю функцию и присвоить возвращаемую функцию переменной, как показывает @ Джеймс Лонг в своем ответе .
Обновление:
Вы также можете сделать это:
(function() {
window.closedF = function() {
};
}());
хотя оба являются функциональными выражениями