Определить закрытую функцию во время разбора? - PullRequest
4 голосов
/ 08 июля 2011

Обычно я вижу закрытие функции, достигаемое формой

var closedF = (function()
{
    return function(){/* return value */}
})();

, так что вызов closedF() возвращает возвращаемое значение из внутренней функции.Но я хочу создать closedF, используя объявление функции (выше - выражение функции), чтобы оно было определено во время разбора.Т.е.

function closedF()
{
    return function(){/* return value */}
}

, но это не работает, потому что при вызове closedF() он возвращает внутреннюю функцию, а не возвращаемое значение внутренней функции.Примечание: с приведенным выше объявлением я мог бы использовать closedF()(), но это просто не элегантно.

Возможно ли это?

ps Как обычно, у меня есть много способов решить мой конкретный вопрос.проблема программирования, но на самом деле я хочу, чтобы кто-то показал мне, что закрытые функции не являются функциями «второго сорта» в JS.

Ответы [ 4 ]

3 голосов
/ 09 июля 2011

Ваша проблема не обязательно имеет отношение к выражению функции против объявления функции.

В обоих случаях, которые вы показали, вы не получите возвращаемое значение внутренней функции.

Вы могли бы получить его, просто вызвав внутреннюю функцию и вернув ее значение:

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() {

    };
}());

хотя оба являются функциональными выражениями

2 голосов
/ 09 июля 2011

Это невозможно.Единственный способ получить функцию из замыкания - это фактически выполнить функцию обтекания, которая, конечно, не может произойти во время компиляции.

Код, который вы на самом деле ищете:

var closedF = function(){
    return function(){
       // do stuff
    }
}(); // <-- note the (), which immediately calls the outer function

В конечном счете, нет даже действительного варианта использования того, о чем вы просите.Смысл замыкания в том, что вы можете получить ссылки на внешние переменные, передаваемые во время выполнения программы, которые доступны для конкретной функции.Если вы пытаетесь сделать это во время компиляции, у вас уже есть доступ ко всему, что вы пытаетесь получить, поскольку еще не выполнено ни одного кода.Поэтому нет необходимости в закрытии.

Если вы публикуете именно то, что пытаетесь сделать, может быть другое решение.

1 голос
/ 09 июля 2011

Рассматривали ли вы передачу функции в качестве параметра?

function closedF(fn){
    return fn;
}

И использовать ее:

var fnParam = function(){...};
...
closedF(fnParam);
1 голос
/ 09 июля 2011

Вы имеете в виду что-то вроде этого:

function closedF() {
    return function () {
    }
}

Да, это вполне приемлемо

Редактировать : Читая комментарии, я думаю, что вам нужна самозапускающаяся анонимная функция:

var closedF = (function () {
    return function () {
    };
}());

Это создаст функцию, которую можно просто выполнить, вызвав closedF(), но я не знаю, возможно ли это как объявление.

...