有人可以解释一下这个程序采取的步骤以及采取这些步骤以产生结果“假”的顺序
function negate(func) {
return function(x) {
return !func(x);
};
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));
答案 0 :(得分:8)
// 1. A function called "negate is declared
function negate(func) { // 3. The "isNaN" function is received by negate().
return function(x) { // 4. A function is returned from the negate() call
return !func(x); // that invokes the "isNaN" function, and returns
}; // the logical opposite of its return value.
}
// 2. The built in "isNaN" function is passed to negate()
var isNotNaN = negate(isNaN);
// 5. The function returned from negate() is assigned to the "isNotNaN" variable
// 6. The "isNotNaN" function is invoked, and passed the "NaN" value.
show(isNotNaN(NaN));
// 7. The result returned from "isNotNaN" is passed to the show() function.
最终结果是你有一个返回与isNaN
函数相反的函数。
如果您可以自己使用isNaN
致电!
,那就好像太过分了。
show( !isNaN(NaN) ); // gives the same result
答案 1 :(得分:2)
negate()
功能。isNotNaN
设置为返回negate(isNaN)
。negate()
返回一个函数,同时将范围保持为func
(在本例中为isNaN
)。show()
致电isNotNan(NaN)
(不将数字传递给isNaN
否定)。与( ! isNaN(NaN))
相同。答案 2 :(得分:2)
代码定义了一个函数“negate”,它作为参数另一个函数。 “negate”函数本身返回另一个函数,该函数返回与传入的参数调用参数函数的结果相反的布尔值。
然后代码定义了一个变量“isNotNan”,并将其设置为等于使用一个名为“isNaN”的函数(我们在这里看不到)调用“negate”的结果。使用常量NaN
调用 函数实际上与调用!isNaN(NaN)
相同,false
因为NaN
是NaN
。
答案 3 :(得分:1)
当你调用函数否定时,它会在你传递给它的函数周围创建一个闭包。所以当你调用isNotNaN时,它实际上运行的是isNaN,它已被包含在函数中,然后用布尔运算符“!”来否定它。
答案 4 :(得分:1)
function negate(func) {
return function(x) {
return !func(x);
};
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));
让我们从顶部开始:
function negate( func )
{
...
}
使用参数negate
声明函数func
。该函数返回一个匿名函数:
function(x)
{
return !func(x);
}
匿名函数将执行原始函数func
参数中提供的函数,但否定返回值。
然后将isNotNaN设置为当参数不 true
时将返回NaN
的函数,以及当参数为<时返回false
的函数/ em> NaN
;
var isNotNaN = negate( isNaN );
最后将NaN
放入函数中,返回预期结果false
show( isNotNaN( NaN ) );