Должен ли я всегда давать возвращаемое значение моей функции?
Я пишу код 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 ответов
"чистая" функциональная среда программирования не будет иметь побочных эффектов - Работа каждой функции будет полностью при вычислении его возвращаемого значения; это невозможно в типичном использовании Javascript, и поэтому вполне приемлемо, когда функция выполнила свою работу через побочные эффекты, чтобы она вообще ничего не возвращала, т. е. была "процедурой", а не функцией.
мой вопрос следующий: у меня есть функция, которая не должна (и не возвращает) значение. Имеет ли смысл в контексте функционального программирования есть функция без явного возвращаемого значения? Или где-то потерпел неудачу, если я оказался в этом случае?
в соответствии с академическим описанием функции: функция должна давать тот же результат, что и при вводе. Функция, которая не имеет никакого вывода, абсолютно бесполезна, потому что функции не должны иметь никаких побочных эффектов.
однако, поскольку функциональным языкам программирования часто требуется по крайней мере 1 побочный эффект, соглашение о возврате nothing заключается в возврате единицы или "()". Поскольку эта концепция не существует в Javascript, это не должно иметь для вас значения, поскольку Javascript все равно не сильно типизирован.
прекрасно иметь функцию, которая ничего не возвращает. Фактически, принуждение функции, которая, естественно, не будет иметь возвращаемого значения, к ней неудобно и плохо.
функция которая производит только побочный эффект может быть рассмотрена просто как изолированный блок программы, такой же как блок процедуры. Поскольку JS не имеет процедур, нет ничего плохого в использовании функции в качестве блока процедур. Единственное исключение, что функции в JS также являются объектами, поэтому будьте осторожны с широким использованием таких "функций".
в этом случае это просто увеличивает читаемость программы.
Если вы не должны использовать результат LIB_hashManager
Я думаю, что вы должны обязательно вернуться undefined
(т. е. вообще не имеют оператора return).
Если вы забудете это и попытаетесь использовать результат функции в любом случае, вы, вероятно, просто получите ошибку (что нормально, так как это будет ошибка программирования, ошибка!)
на этот вопрос был дан ответ более 4 лет назад, но я считаю, что принятый ответ неправильно
в данном коде автор устанавливает интервал, а затем-он не предоставляет никакого способа остановить его.
и поэтому ответ должен быть: Да, вы должны вернуть значение из этой функции, и это значение должно быть объектом, позволяющим остановить интервал, который запускается внутри него.
обсуждаем данные как это должно быть реализовано вне области. // вы можете сделать это, вернув обработчик интервалов, чтобы отменить его вручную (см. Пример 1) или вернув объект с помощью метода, который делает это за сценой (smth like .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);
};