作为一名新的javascript开发人员,我花了一些时间来处理来自Chapter 6 of Eloquent Javascript的代码snippit,我仍在尝试理解以下代码示例:
function negate(func) {
return function(x) {
return !func(x);
};
}
var isNotNaN = negate(isNaN);
document.writeln(isNotNaN(NaN));
特别丢失我的是以下行,我只是不理解一般的调用以及 NaN 的变量/值来自:
document.writeln(isNotNaN(NaN));
答案 0 :(得分:2)
negate
将一个函数作为参数,并返回一个新函数,该函数返回原始函数的相反结果。
NaN是表示Not-A-Number的值。
NaN是全局对象的属性。
NaN的初始值是Not-A-Number - 与值相同 Number.NaN。在现代浏览器中,NaN是不可配置的, 不可写财产。即使不是这种情况,也要避免 压倒它。
NaN是全局对象的属性,因此它是window.NaN
。
请注意typeof NaN
返回number
。
答案 1 :(得分:2)
我认为xdazz几乎涵盖了它,但是既然你说你仍然没有得到它可能会有助于听别人说的解释。
这一行:
var isNotNaN = negate(isNaN);
...声明一个变量isNotNan
,该变量被赋予等于调用negate()
函数的结果,并将isNan
作为参数传递。
该参数isNan
实际上是described by MDN的函数,但negate()
会接受任何函数作为参数,您可以说例如var isNotFinite = negate(isFinite);
。
现在negate()
函数实际创建并返回另一个函数,因此在该行运行isNotNan
引用返回的函数后,这意味着您可以将其称为isNotNan(someVal)
。
那么这一行:
document.writeln(isNotNaN(NaN));
...调用isNotNan()
并将其作为参数传递给NaN
,并将结果写入文档。
“我只是不明白...... NaN的变量/值来自”
NaN
是全局对象的属性。为了过度简化,它是JS环境为您提供的常量。
关于negate()
函数如何工作,它依赖于“闭包”的概念,这意味着在negate()
内声明的函数即使在{{1}之后也可以访问其变量和参数完成。您会注意到返回的函数引用了negate()
参数。因此,当您通过func
调用返回的函数时,它仍然可以访问设置为isNotNaN()
函数的原始func
参数。
效果有点像这样:
isNan