3

作为一个新的 javascript 开发人员,我花了一些时间阅读Eloquent Javascript 第 6 章中的这段代码片段,我仍在尝试理解以下代码示例:

function negate(func) {
  return function(x) {
    return !func(x);
  };
}
var isNotNaN = negate(isNaN);
document.writeln(isNotNaN(NaN));

它特别让我失望的是以下行,我只是不理解一般的调用以及NaN的变量/值来自哪里:

document.writeln(isNotNaN(NaN));
4

2 回答 2

2

我认为 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()funcisNotNaN()funcisNan

效果有点像这样做:

var isNotNaN = function(x) {
    return !isNan(x);
};
于 2012-08-18T06:49:18.430 回答
2

negate将函数作为参数,并返回一个新函数,该函数返回与原始函数相反的结果。

NaN是表示 Not-A-Number 的值。

NaN 是全局对象的属性。

NaN 的初始值为 Not-A-Number — 与 Number.NaN 的值相同。在现代浏览器中,NaN 是不可配置、不可写的属性。即使不是这种情况,也要避免覆盖它。

NaN 是全局对象的一个​​属性,所以它是window.NaN.

并注意typeof NaN回报number

于 2012-08-18T05:56:41.073 回答