这个功能如何修改另一个?(高阶函数)

Mar*_*ant 2 javascript functional-programming

这段代码在做什么?它是如何执行的?什么是x等于?

另一种有用的高阶函数类型修改了它给出的函数值:

function negate(func) {
  return function(x) {
    return !func(x);
  };
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 6

该函数negate()返回一个Function对象,该对象在被调用时将传递return !func(x);任何参数x.这个Function对象被存储在变量isNotNaNfunc结合于内置函数isNaN().在下一行中,isNotNaN使用参数NaN(JavaScript关键字)调用存储的函数对象.正是在这一点上x受到约束NaN.返回值传递给函数show()(此处未显示).

有关更多信息,请阅读JavaScript函数,并参考JavaScript的Function对象function表达式的文档.

编辑:为什么这样?有时,使用一个反转给定布尔函数的函数是有用的.例如,假设您有一些复杂的谓词,并且您希望为谓词所在的所有元素过滤数组false.您可以使用negate()将谓词函数转换为一个函数,该函数计算true这些元素并仅用于Array.prototype.filter()完成工作.可以把它想象成一个实用函数,它可以节省你function(x) { return !predicate(x); }每次想要布尔值函数的逆时都要写很多东西.它有点琐碎,但是很多JS库(例如,underscore.js,jquery等)都有这样的实用功能.

PS我会更一般地写它:

function negate(func) {
  return function() {
    return !func.apply(null, arguments);
  };
}
Run Code Online (Sandbox Code Playgroud)

这样,它可以与任意数量的参数的布尔值函数一起使用.

  • 是的,你可以否定原始函数的输出.这可能是装饰器模式的一个示例,其中函数被传递给另一个函数以改变其行为. (2认同)