Должен ли я всегда давать возвращаемое значение для моей функции? - PullRequest
11 голосов
/ 24 мая 2009

Я пишу код JavaScript и пытаюсь использовать его функциональную языковую природу.

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

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

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

LIB_hashManager = function(f, context) {
    var prev = '';
    var pollHash = function() {
        if (prev !== window.location.hash) {
            prev = window.location.hash;
            f.apply(context);
        }
    };
    window.setInterval(pollHash, 100);
};

Должен ли я вернуться сюда что-нибудь?

Обновление

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

LIB_hashManager = function(f, context) {
    // inside logic
    // ...
};

А позже я могу написать:

LIB_hashManager = function(f, context) {
    // inside logic
    // ...

    // return public methods
    return {
        // ...
    }
};

Так не имеет ли смысла возвращать пустой объект в первом случае?

Ответы [ 6 ]

18 голосов
/ 24 мая 2009

«Чистая» функциональная среда программирования не будет иметь побочных эффектов - работа каждой функции будет полностью при вычислении ее возвращаемого значения; на самом деле это неосуществимо в типичных случаях использования Javascript, и поэтому вполне допустимо, когда функция выполняет свою работу с помощью побочных эффектов, чтобы она вообще ничего не возвращала, то есть была бы «процедурой», а не функцией.

5 голосов
/ 24 мая 2009

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

Согласно академическому описанию функции: функция должна выдавать тот же результат при заданном входе. Функция, которая не имеет никакого выхода, абсолютно бесполезна, потому что функции не должны иметь никаких побочных эффектов.

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

2 голосов
/ 24 мая 2009

Прекрасно иметь функцию, которая ничего не возвращает. Фактически, принуждение функции, которая, естественно, не имела бы возвращаемого значения, иметь неловкое значение и плохо пахнет .

1 голос
/ 24 мая 2009

Функция, которая производит только побочный эффект, может рассматриваться просто как изолированный программный блок, так же как и блок процедуры. Поскольку в JS нет процедур, нет ничего плохого в том, чтобы использовать функцию в качестве блока процедур. Единственное исключение, что функции в JS также являются объектами, поэтому будьте осторожны при широком использовании таких «функций».

В этом случае это только увеличивает читаемость программы.

0 голосов
/ 16 декабря 2013

На этот вопрос был дан ответ более 4 лет назад, но я считаю, что принятый ответ неправильный


В данном коде автор устанавливает интервал, а затем - он не предоставляет НИКАКОГО способа остановить его.

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

Обсуждение деталей того, как это должно быть реализовано, выходит за рамки. // вы можете сделать это, либо вернув обработчик интервала, так что вы можете отменить его вручную (см. пример 1) или вернуть объект с методом, который делает это за сценой (что-то вроде .pause, .stop или .cancel ). В качестве альтернативы, этот объект может также разрешить реконфигурацию хэш-менеджера во время выполнения (например, изменение частоты интервала).

Пример 1 (простой):

LIB_hashManager = function(f, context) {
    var prev = '';
    var pollHash = function() {
        if (prev !== window.location.hash) {
            prev = window.location.hash;
            f.apply(context);
        }
    };
    return window.setInterval(pollHash, 100);
};
0 голосов
/ 24 мая 2009

Если вы не должны использовать результат LIB_hashManager Я думаю, что вы обязательно должны вернуть undefined (т.е. вообще не иметь оператора return).

Если вы забудете об этом и в любом случае попытаетесь использовать результат функции, вы, вероятно, просто получите ошибку (что нормально, поскольку это будет ошибка программирования, ошибка!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...