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

时间:2016-01-28 02:37:39

标签: javascript functional-programming

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

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

function negate(func) {
  return function(x) {
    return !func(x);
  };
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));

1 个答案:

答案 0 :(得分:6)

函数negate()返回一个Function对象,当被调用时,return !func(x);将传递任何参数x。此Function对象存储在变量isNotNaN中,func绑定到内置函数isNaN()。在下一行中,使用参数isNotNaN(JavaScript关键字)调用NaN中存储的函数对象。此时x已绑定到NaN。返回值传递给函数show()(此处未显示)。

有关详细信息,请阅读JavaScript函数here,并参阅JavaScript Function objectfunction expression的文档。

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

P.S。我会更一般地写它:

function negate(func) {
  return function() {
    return !func.apply(null, arguments);
  };
}

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