今天早些时候我正在编写一些代码,当我意识到,“嘿!如果我将 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/