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

这是来自我正在阅读的一本 JavaScript 书籍。func用作带有参数x和前面的否定符号的函数。怎么来的?

4

2 回答 2

5

negate函数接受一个函数作为参数并返回一个它创建的新函数,当调用该函数时,它将使用您给它的参数调用原始函数,否定该函数的返回值,并返回该否定值。

negate用于创建我们分配给isNotNaN它的函数,当被调用时,它将isNaN使用您传递的任何参数调用并否定结果。

因此,当您调用isNotNaNwith时NaNisNotNaN调用isNaN(NaN)它会返回trueisNotNaN然后否定它,获取false并返回该值。

于 2013-08-14T13:40:08.997 回答
0

使用对函数起作用的函数是每个人一开始都在努力的概念,所以不要自责。但是一旦摸索,它可能是一个非常强大的工具。

函数式编程的主要内容之一(在 JavaScript 中也有效)是函数与其他原语(如数字)没有什么不同。用外行的话来说,它们是你可以做的事情。数字可以加、减、负,函数可以应用、组合、卷积。

所以我们可以有一个函数add将两个数字相加,我们可以有一个combine结合两个函数的函数,如下所示:

//add is a function with two parameters that are numbers
//add's result is a number    
var add = function (first, second){
   var result = first + second
   return result;
}

//combine is a function with two parameters that are functions with one parameter
//combine's result is a function with one parameter
var combine = function (first, second){
  var result = function(x) { return first(second(x)); }
  return result;
}

如您所见,这两种方法在结构上或多或少相同。它们将被称为:

add(1, 2); //result is 3

var double = function (x) {return x*2};
var square = function (x) {return x*x};

// result is a function that returns a double of the square
var squareAndDouble = combine(double, square);

squareAndDouble(3); //result is 18

所以现在,让我们解构你的例子:

function negate(func) {
   return function(x) {
     return !func(x);
   };
}

这是一个被调用的函数negate,它接受一个名为 的参数funcfunc是一个参数的函数,它的结果是一个布尔值。为了func(x)成为合法的表达方式,这是必需的,为什么!func(x)是合法的。

在主体中negate构造了一个新函数。这个函数没有名字,也不需要名字,因为我们正在构造和返回它。调用该negate函数的人应该负责命名(我将其称为结果函数)。本质上,这是negate函数的等价形式,我个人更喜欢在我的代码中使用它:

function negate(func) {
   var result = function(x) {
     return !func(x);
   };
   return result;
}

结果函数将接受一个名为 的参数x,并将返回!func(x)表达式的值,本质上否定从 的返回值func,即如果func(x)返回一个真值,则结果将为假,反之亦然。

这就是为什么当我们调用negate函数时,为它提供[isNaN][1]函数(确实接受一个参数,并返回一个布尔值),我们得到一个与isNaN. 该(无名)函数包含在isNotNaN变量中。

现在,由于该变量包含一个函数,我们可以像普通函数一样执行,并且isNotNaN(NaN))会返回false

isNotNan(Nan) => !isNaN(NaN) => !true => false
于 2013-08-14T14:07:59.240 回答