此函数如何修改另一个函数?(高阶函数)

How does this function modify the other? (Higher Order Functions)

本文关键字:函数 另一个 高阶 何修改 修改      更新时间:2023-09-26

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

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

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

函数negate()返回一个Function对象,该对象在调用时将return !func(x);传递x的任何参数。此Function对象存储在变量isNotNaN中,func绑定到内置函数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等)都有大量的这样的实用程序函数。

附言我会更笼统地写它:

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

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