我编写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
的知识,遵循功能构造函数模式,我可以简单地向对象添加方法和{{1}将返回该生成的对象。
LIB_hashManager
后来我可以写:
LIB_hashManager = function(f, context) {
// inside logic
// ...
};
那么在第一种情况下返回一个空对象没有意义吗?
答案 0 :(得分:18)
“纯粹”的函数式编程环境没有任何副作用 - 每个函数的工作在计算其返回值时都完全;这在Javascript的典型使用中并不是真的可行,所以当一个函数通过副作用完成它的工作时,它完全可以接受,它根本不返回任何东西,即,是一个“过程”而不是一个函数。
答案 1 :(得分:5)
我的问题如下:我有一个不需要(也没有)返回值的函数。在函数式编程上下文中,有一个没有显式返回值的函数是否有意义?如果我发现自己遇到这种情况,或者在某处失败了?
根据函数的学术描述:函数必须在给定输入的情况下给出相同的输出。没有任何输出的函数绝对没用,因为函数不应该有任何副作用。
然而,由于函数式编程语言通常需要至少1个副作用,因此返回任何内容的约定是返回单元或“()”。由于Javascript中不存在这个概念,因此对你来说无关紧要,因为无论如何Javascript都没有强类型。
答案 2 :(得分:2)
拥有一个不返回任何东西的功能是完全没问题的。事实上,强制一个自然没有返回值的函数有一个很尴尬,闻起来很糟糕。
答案 3 :(得分:1)
仅产生副作用的函数可以简单地视为孤立的程序块,与过程块相同。由于JS没有过程,因此将函数用作过程块没有任何错误。 JS中函数的唯一例外也是对象,所以要小心大量使用这些“函数”。
在这种情况下,它只是增加了程序的可读性。
答案 4 :(得分:0)
如果你不应该使用LIB_hashManager
的结果,我认为你应该肯定地返回undefined
(即根本没有回复声明)。
如果你忘记了这一点,并尝试使用函数的结果,你可能只会得到一个错误(这很好,因为这将是一个编程错误,一个错误!)
答案 5 :(得分:0)
这个问题已在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);
};