我认为 xdazz 几乎涵盖了它,但既然你说你仍然不明白,也许听听别人的解释会有所帮助。
这一行:
var isNotNaN = negate(isNaN);
...声明一个isNotNan
分配给函数调用结果的变量,作为参数negate()
传递。isNan
该参数isNan
实际上是MDN 描述的函数,但negate()
可以接受任何函数作为参数,例如var isNotFinite = negate(isFinite);
.
现在该negate()
函数实际上创建并返回另一个函数,因此在该行运行isNotNan
引用返回的函数之后,这意味着您可以将其调用为isNotNan(someVal)
.
那么这一行:
document.writeln(isNotNaN(NaN));
... 调用isNotNan()
并将其NaN
作为参数传递,并将结果写入文档。
“我只是不明白...... NaN 的变量/值来自哪里”
NaN
是全局对象的属性。简单来说,它是 JS 环境提供给您的常量。
关于negate()
函数的工作原理,它依赖于“闭包”的概念,这意味着在内部声明的函数即使在negate()
完成后也可以访问其变量和参数。您会注意到返回的函数引用了该参数。因此,当您通过它调用返回的函数时,仍然可以访问设置为该函数的原始参数。negate()
func
isNotNaN()
func
isNan
效果有点像这样做:
var isNotNaN = function(x) {
return !isNan(x);
};