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);
};