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

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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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


В приведенном коде автор устанавливает интервал, а затем - он не предоставляет ЛЮБОЙ способ его остановить.

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

Обсуждение деталей того, как это должно быть реализовано, выходит за рамки.//вы можете сделать это либо путем возврата обработчика интервала, так что вы можете отменить его вручную (см. пример 1) или вернуть объект с помощью метода, который выполняет это за сценой (smth, например .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);
};