为什么从函数调用 func

How come func is called from a function?

本文关键字:func 函数调用 为什么      更新时间:2023-09-26
function negate(func) {
  return function(x) {
    return !func(x);
  };
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));

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

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

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

所以当你用 NaN 调用isNotNaN时,isNotNaN调用 isNaN(NaN) ,返回true。 然后isNotNaN否定它,得到false,并返回该值。

使用适用于

函数的函数是每个人一开始都在努力解决的概念,所以不要自责。但是一旦摸索,它可以成为一个非常强大的工具。

函数

式编程的主要内容之一,在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 的函数,它接受一个名为 func 的参数。 func是一个参数的函数,它的结果是一个布尔值。为了使func(x)成为一种合法的表达方式,以及为什么!func(x)是合法的,这是必要的。

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

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

result 函数将采用一个名为 x 的单个参数,它将返回!func(x)表达式的值,实质上否定从 func 返回的值,即如果func(x)返回一个真值,则结果将为假,反之亦然。

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

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

isNotNan(Nan) => !isNaN(NaN) => !true => false