我应该总是给我的功能一个返回值吗?

时间:2009-05-24 05:04:21

标签: javascript functional-programming return-value methodology

我编写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
    // ...
};

那么在第一种情况下返回一个空对象没有意义吗?

6 个答案:

答案 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);
};