理解Eloquent Javascript中的negate()函数示例(第6章)

时间:2012-08-18 05:53:24

标签: javascript

作为一名新的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));

2 个答案:

答案 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