-1
function negate(func) {
  return function(x) {
    return !func(x);
  };
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));

これは、私が読んでいる JavaScript の本からのものです。は、引数とその前に否定記号funcを付けて関数として使用されます。xどうして?

4

2 に答える 2

5

関数は引数として関数を受け入れ、それが作成する新しい関数を返します。このnegate関数が呼び出されると、元の関数が指定された引数で呼び出され、その関数の戻り値が否定され、否定された値が返されます。

negateは、割り当てた関数を作成するために使用されます。呼び出されると、渡された引数を使用してisNotNaN呼び出し、結果を否定します。isNaN

したがって、 を呼び出すisNotNaNNaNisNotNaNが呼び出されisNaN(NaN)、 が返されますtrueisNotNaN次にそれを否定して を取得しfalse、その値を返します。

于 2013-08-14T13:40:08.997 に答える
0

関数で機能する関数を使用することは、誰もが最初は苦労する概念です。しかし、一度理解すれば、信じられないほど強力なツールになる可能性があります。

JavaScript でも有効な関数型プログラミングの重要な要素の 1 つは、関数が数値などの他のプリミティブと変わらないことです。それらは、素人の言葉で言えば、あなたが何かをすることができるものです. 数値の加算、減算、否定、関数の適用、結合、畳み込みが可能です。

したがって、次のaddように、2 つの数値を加算する関数を呼び出したりcombine、2 つの関数を結合する関数を呼び出したりすることができます。

//add is a function with two parameters that are numbers
//add's result is a number    
var add = function (first, second){
   var result = first + second
   return result;
}

//combine is a function with two parameters that are functions with one parameter
//combine's result is a function with one parameter
var combine = function (first, second){
  var result = function(x) { return first(second(x)); }
  return result;
}

ご覧のとおり、これら 2 つのメソッドの構造はほぼ同じです。それらは次のように呼び出されます。

add(1, 2); //result is 3

var double = function (x) {return x*2};
var square = function (x) {return x*x};

// result is a function that returns a double of the square
var squareAndDouble = combine(double, square);

squareAndDouble(3); //result is 18

それでは、例を分解しましょう。

function negate(func) {
   return function(x) {
     return !func(x);
   };
}

これは、negateというパラメーターを受け取る という関数funcです。funcは 1 つのパラメーターの関数であり、その結果はブール値です。が合法的な表現であるためには、それが必要でfunc(x)あり、なぜ!func(x)合法なのか。

negate新しい関数の本体で構築されます。この関数には名前がなく、名前も必要ありません。作成して返すためです。関数を呼び出す人は誰でもnegate名前付けを行う必要があります (結果関数と呼びます)。基本的に、これはnegate関数の同等の形式であり、私のコードで個人的に好むものです。

function negate(func) {
   var result = function(x) {
     return !func(x);
   };
   return result;
}

結果関数は と呼ばれる 1 つのパラメーターを取りx、式の値を返します。つまり、!func(x)から返された値を本質的に否定します。つまり、真の値を返す場合、結果は false になり、その逆も同様です。funcfunc(x)

そのため、関数を呼び出してnegate関数を提供すると[isNaN][1](実際には単一のパラメーターを取り、ブール値を返します)、 の反対を行う関数が返されますisNaN。その (名前のない) 関数は、isNotNaN変数に格納されます。

さて、その変数は関数を保持しているので、通常の関数と同じように実行でき、isNotNaN(NaN))を返しfalseます。

isNotNan(Nan) => !isNaN(NaN) => !true => false
于 2013-08-14T14:07:59.240 に答える