function negate(func) {
return function(x) {
return !func(x);
};
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));
これは、私が読んでいる JavaScript の本からのものです。は、引数とその前に否定記号func
を付けて関数として使用されます。x
どうして?
function negate(func) {
return function(x) {
return !func(x);
};
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));
これは、私が読んでいる JavaScript の本からのものです。は、引数とその前に否定記号func
を付けて関数として使用されます。x
どうして?
関数は引数として関数を受け入れ、それが作成する新しい関数を返します。このnegate
関数が呼び出されると、元の関数が指定された引数で呼び出され、その関数の戻り値が否定され、否定された値が返されます。
negate
は、割り当てた関数を作成するために使用されます。呼び出されると、渡された引数を使用してisNotNaN
呼び出し、結果を否定します。isNaN
したがって、 を呼び出すisNotNaN
とNaN
、isNotNaN
が呼び出されisNaN(NaN)
、 が返されますtrue
。isNotNaN
次にそれを否定して を取得しfalse
、その値を返します。
関数で機能する関数を使用することは、誰もが最初は苦労する概念です。しかし、一度理解すれば、信じられないほど強力なツールになる可能性があります。
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 になり、その逆も同様です。func
func(x)
そのため、関数を呼び出してnegate
関数を提供すると[isNaN][1]
(実際には単一のパラメーターを取り、ブール値を返します)、 の反対を行う関数が返されますisNaN
。その (名前のない) 関数は、isNotNaN
変数に格納されます。
さて、その変数は関数を保持しているので、通常の関数と同じように実行でき、isNotNaN(NaN))
を返しfalse
ます。
isNotNan(Nan) => !isNaN(NaN) => !true => false