function negate(func) {
return function(x) {
return !func(x);
};
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));
这是来自我正在阅读的一本 JavaScript 书籍。func
用作带有参数x
和前面的否定符号的函数。怎么来的?
function negate(func) {
return function(x) {
return !func(x);
};
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));
这是来自我正在阅读的一本 JavaScript 书籍。func
用作带有参数x
和前面的否定符号的函数。怎么来的?
该negate
函数接受一个函数作为参数并返回一个它创建的新函数,当调用该函数时,它将使用您给它的参数调用原始函数,否定该函数的返回值,并返回该否定值。
negate
用于创建我们分配给isNotNaN
它的函数,当被调用时,它将isNaN
使用您传递的任何参数调用并否定结果。
因此,当您调用isNotNaN
with时NaN
,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;
}
结果函数将接受一个名为 的参数x
,并将返回!func(x)
表达式的值,本质上否定从 的返回值func
,即如果func(x)
返回一个真值,则结果将为假,反之亦然。
这就是为什么当我们调用negate
函数时,为它提供[isNaN][1]
函数(确实接受一个参数,并返回一个布尔值),我们得到一个与isNaN
. 该(无名)函数包含在isNotNaN
变量中。
现在,由于该变量包含一个函数,我们可以像普通函数一样执行,并且isNotNaN(NaN))
会返回false
。
isNotNan(Nan) => !isNaN(NaN) => !true => false