为什么从函数调用 func
How come func is called from a function?
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
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- 如何在Javascript函数调用中循环变量
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 如何远程检查JavaScript应用程序的函数调用堆栈
- javascript函数调用不起作用
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 如何通过函数调用设置图像的src
- 从全局函数调用Ember控制器上的方法
- 为什么Jquery$.ajax在函数调用中触发所有statusCode,即使调用成功
- JavaScript函数调用(arg1)(arg2)
- 打印链接时,将javascript函数调用到链接中
- 在函数调用中封装数据除了隐藏数据之外还有什么优点
- 无法从JavaScript中的函数调用对象属性
- 对中的函数调用进行排序是回调的唯一方法
- 函数调用方法有什么用
- Javascript:JSHint:应为赋值或函数调用,但实际看到的却是表达式
- HTML5(Bootstrap)通过函数调用运行动画
- 函数调用不起作用
- 为什么从函数调用 func