13

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

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

4

6 回答 6

20

“纯”函数式编程环境不会产生副作用——每个函数的工作将完全是计算其返回值;这在 Javascript 的典型使用中并不真正可行,因此,当函数通过副作用完成其工作时,让它不返回任何内容,即成为“过程”而不是函数,这是完全可以接受的。

于 2009-05-24T05:10:00.563 回答
5

我的问题如下:我有一个不需要(也不需要)返回值的函数。在函数式编程上下文中,有一个没有显式返回值的函数是否有意义?或者如果我在这种情况下发现自己在某个地方失败了?

根据函数的学术描述:给定输入,函数必须给出相同的输出。没有任何输出的函数是绝对没用的,因为函数不应该有任何副作用。

但是,由于函数式编程语言通常需要至少 1 个副作用,因此不返回任何内容的约定是返回一个单位或“()”。由于 Javascript 中不存在此概念,因此对您来说应该无关紧要,因为 Javascript 无论如何都不是强类型的。

于 2009-05-24T05:37:11.060 回答
2

拥有一个不返回任何内容的函数是非常好的。事实上,强制一个自然不会有返回值的函数有一个很尴尬而且闻起来很糟糕

于 2009-05-24T05:08:18.410 回答
1

只产生副作用的函数可以简单地认为是一个孤立的程序块,与程序块相同。由于 JS 没有过程,所以将函数用作过程块并没有错。JS 中的函数也是对象的唯一例外,因此在广泛使用此类“函数”时要小心。

在这种情况下,它只会增加程序的可读性。

于 2009-05-24T10:58:12.897 回答
1

这个问题已经在 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);
};
于 2013-12-16T15:48:14.463 回答
0

如果你不应该使用LIB_hashManager我认为你应该明确地返回的结果undefined(即,根本没有返回语句)。

如果您忘记了这一点并尝试使用函数的结果,您可能只会得到一个错误(这很好,因为那将是一个编程错误,一个错误!)

于 2009-05-24T06:45:31.470 回答