javascript - 函数式 JavaScript : how to implement Function. prototype.not

标签 javascript functional-programming

今天早些时候我正在编写一些代码,当我意识到,“嘿!如果我将 bool 值的概念从匿名函数中抽象出来并放入原型(prototype)函数中,这段代码会更加简洁和语义化......”

考虑一个谓词生成器:

function equalTo(n) {
    return function(x) {
        return n==x;
    };
}

所以你可以像这样使用它:

[1,2,3,4,1,2,3,4].filter(equalTo(2)) == [2,2]

现在,我的想法是做一个谓词“inverser”:

Function.prototype.not = function() {
    //???
}

这样你就可以说:

[1,2,3,4,1,2,3,4].filter(equalTo(2).not) == [1,3,4,1,3,4]

我对实现的第一次尝试可能非​​常天真:

Function.prototype.not = function () {
    return ! this(arguments);
}

可能还有它不起作用的原因。

您将如何实现此功能,为什么?

我只是想围绕功能性想法进行思考,并且对 JavaScript 有足够的了解,知道它可以用来做这件事,但不知道怎么做。

最佳答案

您的实现将因以下几个原因而无法工作:

  • 您需要返回一个函数,而不是一个 bool 值。
  • 您应该按原样传递参数,而不是封装在数组中。
  • 您应该保留调用该函数的上下文(this 关键字)。

我会这样实现:

Function.prototype.not = function (context) {
    var func = this;
    return function() { return !func.apply(context || this, arguments); };
}
  • 我返回一个匿名函数 (function() { ... })
  • 我调用 apply 以使用实际参数调用当前上下文中的原始函数。
  • (EDIT) 免费奖励:我添加了一个可选的 context 参数,它将覆盖回调的 this

关于javascript - 函数式 JavaScript : how to implement Function. prototype.not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3295779/

相关文章:

java - 以更实用的方式对目录进行分组

javascript - 修改嵌套对象时是否应该进行深复制?

scala - 为什么 vector[Option[Int]] 上的 flatMap 其映射器函数结果不是 Vector[Option[Int]] 有效?

javascript - 基于排序数组更新组件。 Angular (4.3)

javascript - 视差在具体化 css 中不起作用

javascript - Django 检查 JavaScript 是否开启

f# - "point free"风格在函数式编程中的优缺点是什么?

javascript - 通过硬编码 csv 文件的值实现下载功能

javascript - 避免在手机上下载图片

javascript - 如何在对象身份的上下文中保持 ES2015 代理透明?