JavaScriptの入れ子関数
13329 ワード
多くの人々がJavaScriptの入れ子関数について混乱し、なぜネストされた関数が有用であり、入れ子関数のユースケースは何ですか?私たちのコードやブログの記事や記事のような入れ子になった機能に遭遇する可能性が非常に多くの場所があります.
この記事では、入れ子になった関数が多くの点で有用である理由の基礎についてお話したいと思います.
私はいくつかの制約条件に沿っていくつかの基本的な質問をし始めます.以下のように従業員配列があると仮定しましょう
どのようにプロパティ(年齢、ステータスなど)で配列をソートするのですか?
制約:配列を他の関数へのリファレンスとして渡すことはできません.
典型的には、我々の事前のプログラミング知識で、配列を使ってソートを行います.プロトタイプ.以下のようなソート関数
一般的に、これはJavaScript
では、どうやってその問題を解決しますか?
ヒント:配列に余分な引数を追加せずに、ソートコールバック関数内でカスタム引数をアクセスできます.プロトタイプ.ソート?
これは関数の中で関数(しばしば高次関数と呼ばれる)を使用するのに最適な瞬間です.したがって、ソートインターフェイス要件に従って2つの引数しか受け付けない関数を返すことができます.
SortBy機能の第2のバージョンは、ここにあります
どのように、あなたは不活発な従業員と配列をフィルターに入れますか?
制約:すべてのアクティブな従業員(IsActiveExcel)機能が既に存在しているフィルタアウトのための機能があると仮定して、コード複製なしですべての非アクティブな従業員を得るために同じ機能を使用してください.
したがって、我々はすでにすべてのアクティブな従業員を見つけるコードを考えているので、iSactiveEncoty関数の結果を反転させるために我々はすべての非アクティブな従業員を得ることができなくても、非アクティブな従業員をフィルタアウトするためのブランドの新しい機能を書くことなく.
メソッドのようです
クリーナー抽象化 は、構成可能な機能と多くの で働いています
https://eloquentjavascript.net/05_higher_order.html
https://javascript.info/currying-partials
この記事では、入れ子になった関数が多くの点で有用である理由の基礎についてお話したいと思います.
私はいくつかの制約条件に沿っていくつかの基本的な質問をし始めます.以下のように従業員配列があると仮定しましょう
const employee = [
{ id: 1, name: "Raja", age: 28, status: "active" },
{ id: 2, name: "Andy", age: 32, status: "Inactive" },
{ id: 3, name: "Kumar", age: 45, status: "active" },
{ id: 4, name: "Charles", age: 35, status: "Inactive" },
];
使用ケース1
どのようにプロパティ(年齢、ステータスなど)で配列をソートするのですか?
制約:配列を他の関数へのリファレンスとして渡すことはできません.
典型的には、我々の事前のプログラミング知識で、配列を使ってソートを行います.プロトタイプ.以下のようなソート関数
function sortBy(array, propName) {
return array.sort(function (a, b) {
if (a[propName] > b[propName]) {
return 1;
} else if (a[propName] < b[propName]) {
return -1;
} else {
return 0;
}
});
}
console.log(sortBy(employee, "age"));
console.log(sortBy(employee, "status"));
上記のコードはうまく仕事をしますが、最初のユースケースの最初の制約を見てください.それで、それは明らかにそれがする方法でないと言います.関数への配列リファレンスを渡します一般的に、これはJavaScript
// How do to pass another arguments to tell sort based on which property of an object ???????
Array.prototype.sort(function(a, b))
我々が配列を知っているように.プロトタイプ.sortインターフェースは2つの引数を受け入れるだけです.さて、sortメソッドは2つのパラメータしか受け付けないことを理解しています.では、どうやってその問題を解決しますか?
ヒント:配列に余分な引数を追加せずに、ソートコールバック関数内でカスタム引数をアクセスできます.プロトタイプ.ソート?
これは関数の中で関数(しばしば高次関数と呼ばれる)を使用するのに最適な瞬間です.したがって、ソートインターフェイス要件に従って2つの引数しか受け付けない関数を返すことができます.
SortBy機能の第2のバージョンは、ここにあります
function sortBy(propName) {
return function (a, b) { // obeying sort interface function signature
if (a[propName] > b[propName]) { // propName accessible from highorder function
return 1;
} else if (a[propName] < b[propName]) {
return -1;
} else {
return 0;
}
};
}
console.log(employee.sort(sortBy("age")));
console.log(employee.sort(sortBy("status")));
フィルタユースケースを持つ高機能のもう一つのユースケースについて議論したいユースケース2
どのように、あなたは不活発な従業員と配列をフィルターに入れますか?
制約:すべてのアクティブな従業員(IsActiveExcel)機能が既に存在しているフィルタアウトのための機能があると仮定して、コード複製なしですべての非アクティブな従業員を得るために同じ機能を使用してください.
function isActiveEmployee(employee) {
return employee.status == 'active';
}
const activeEmployee = employee.filter(isActiveEmployee);
// const inactiveEmployee = employee.filter(??????);
我々は何も考えずに簡単に解決策を考え出すかもしれないfunction isInactiveEmployee(employee) {
return employee.status !== 'active';
}
//(or)
function isInactiveEmployee(employee) {
return employee.status === 'inactive';
}
ちょうどuse case 2の制約の穏やかなリマインダー、それは言いました、我々はコードを複製しないでください、それで、我々はより良い方法をすることができますか?したがって、我々はすでにすべてのアクティブな従業員を見つけるコードを考えているので、iSactiveEncoty関数の結果を反転させるために我々はすべての非アクティブな従業員を得ることができなくても、非アクティブな従業員をフィルタアウトするためのブランドの新しい機能を書くことなく.
メソッドのようです
function negate(item){
return !isActiveEmployee(item)
}
しかし、我々はさらに良いことができる、我々は以下のように書くことができるようにユーティリティを関数としてnegateを考えるかもしれない function negate(predicate){
return function() {
return !predicate.apply(this, arguments)
}
}
ここではすべての非アクティブな従業員をろ過するためのソリューションですconst inactiveEmployee = employee.filter(negate(isActiveEmployee));
console.log({inactiveEmployee});
今すぐあなたのような高次機能の利点のいくつかを見ることができますさらに読みます。
https://eloquentjavascript.net/05_higher_order.html
https://javascript.info/currying-partials
Reference
この問題について(JavaScriptの入れ子関数), 我々は、より多くの情報をここで見つけました https://dev.to/rajajaganathan/why-nested-functions-in-javascript-3ngpテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol