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

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 に答える
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 に答える