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

Я пишу код на 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 {
        // ...
    }
};

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


person viam0Zah    schedule 24.05.2009    source источник


Ответы (6)


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

person Alex Martelli    schedule 24.05.2009
comment
Как сказал один из создателей Haskell (перефразируя): Если бы вся ваша машина работала на основе чисто функционального подхода, то все, что вы получили бы от нее, было бы горячим ящиком, вы бы никогда не увидели результатов, которые она дала. вычислено. :) - person Mike Tunnicliffe; 24.05.2009
comment
Блин, найти бы эту цитату - person rpivovar; 18.01.2020

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

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

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

person Unknown    schedule 24.05.2009

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

person onedozenbagels    schedule 24.05.2009
comment
Если она не имеет возвращаемого значения, то это не функция, даже если она так называется на языке, о котором мы говорим. - person Ingo; 16.12.2013

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

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

person Thevs    schedule 24.05.2009

На этот вопрос был дан ответ более 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);
};
person c69    schedule 16.12.2013

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

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

person Jonas    schedule 24.05.2009