1. はじめにJavaScript では、関数は実際にはデータであるため、関数を変数に割り当てることもできます。この記事では、JavaScript における高階関数のいくつかの使用法を紹介します。 2. 再帰いわゆる再帰とは、関数が自分自身を呼び出すことを指します。物語で言えば、昔々、山がありました。山にはお寺があり、お寺には若い僧侶に物語を語っている年老いた僧侶がいました。物語は何ですか? 「昔々、山がありました。山にはお寺がありました。お寺には年老いた僧侶がいて、若い僧侶に物語を語っていました。その物語は何でしたか?」「昔々、山がありました。山にはお寺がありました。お寺には年老いた僧侶がいて、若い僧侶に物語を語っていました。その物語は何でしたか?」 ある意味では、再帰はループに似ています。どちらも同じコードを繰り返し実行し、無限ループや無限再帰を回避するために終了条件を必要とします。 再帰に必要な条件は次のとおりです。
JavaScript で再帰呼び出しを行う方法は 2 つあります。
次のコードは単純な再帰を示しています。 var v = 1 // 終了条件関数 fun() { console.log('first' + v + 'second function call') v++ (v <= 3) の場合 { 楽しい() } } 楽しい() 実行結果は次のとおりです
3. コールバック関数関数は変数に割り当てることができるデータと同じなので、他のデータと同様に定義、削除、コピーしたり、他の関数に引数として渡したりすることができます。 関数が別の関数に引数として渡される場合、引数として渡される関数はコールバック関数と呼ばれます。コールバック関数を使用する関数はターゲット関数(外側の関数)と呼ばれる サンプルコードは次のとおりです。 // 2 つの関数型パラメータを持つ関数を定義し、2 つの関数を個別に実行してその合計を返します。 関数 sum(a, b) { // 対象関数は a() + b() を返す } 関数 1() { // コールバック関数は1を返す } 関数2() { // コールバック関数 return 2 } console.log(合計(1, 2)) // 3 コード実行プロセスは次のとおりです。 3.1 匿名コールバック関数いわゆる匿名コールバック関数は、ターゲット関数のパラメータが名前のない関数である関数です。匿名コールバック関数を使用するように前のコードを変更します。 // 2 つの関数型パラメータを持つ関数を定義し、2 つの関数を個別に実行してその合計を返します。 関数 sum(a, b) { // 対象関数は a() + b() を返す } コンソール.log( 和( 関数 () { // 匿名コールバック関数は 1 を返します }, 関数 () { // 匿名コールバック関数 return 2 }, )、 ) // 3 3.2 パラメータ付きコールバック関数コールバック関数はパラメータを追加できます。サンプルコードは次のとおりです。 関数 multiplyByTwo(リスト、コールバック) { リスト.forEach(関数(v, i) { コールバック(v * 2, i) }) } var リスト = [1, 2, 3] 2乗で乗算(リスト、関数(v、i) { リスト[i] = v }) console.log(リスト) // [ 2, 4, 6 ] 3.3 コールバック関数の利点と欠点
しかし、コールバック関数にも欠点があります。対象関数のパラメータがコールバック関数であり、そのコールバック関数のパラメータが別のコールバック関数であり、その別のコールバック関数のパラメータもコールバック関数である場合...つまり、入れ子人形となり、コールバックトラップが形成されます。さらに深刻な場合は、コールバック地獄と呼ばれることもあります。 4. セルフチューニング機能いわゆるセルフチューニング関数は、定義後すぐに呼び出される関数です。サンプルコードは以下のとおりです。 ;(関数 () { console.log('セルフチューニング機能') })() この構文は少し難しそうに見えますが、実際には何も問題はありません。匿名関数の定義を括弧のペアの内側に配置し、その外側に別の括弧のペアを配置するだけです。 文法構造は以下の図に示されています。 上記の 2 つの方法に加えて、セルフチューニング機能には他の珍しい方法がいくつかあります。サンプル コードは次のとおりです。 ;+(関数(v) { // 仮パラメータ var w = 100 // ローカル変数 console.log('self-tuning function' + v) })(1) // パラメータ!(function (v) { var w = 100 // ローカル変数 console.log('self-tuning function' + v) })(2) ~(関数(v) { var w = 100 // ローカル変数 console.log('self-tuning function' + v) })(3) 自己調整型匿名関数を使用する利点は、グローバル変数が作成されないことです。 欠点は、このような関数は繰り返し実行できないことです (ループまたは別の関数内に配置されない限り)。これにより、即時関数は、1 回限りのタスクや初期化タスクを実行するのにも非常に適しています。 5. 価値の機能ある関数が別の関数の結果として返される場合、結果として返される関数は値としての関数と呼ばれます。 サンプルコードは次のとおりです。 関数outer() { 変数v = 100 // 関数本体に別の関数を定義する -> 内部(プライベート)関数 return function () { // 無名関数を使用して v * 2 を返す } } var 結果 = 外側() console.log(結果) // [関数] これを行う利点は次のとおりです。
6. 終了クロージャは関数で提案された概念です。簡単に言えば、関数定義は関数外で定義された変数を参照し、関数は定義環境外で実行できます。クロージャは、内部関数が外部関数スコープから何らかの方法でアクセスされたときに発生します。 実際、閉包は関数のより一般的な概念として見ることができます。それはもはや従来の意味で定義された関数ではないからです。 閉鎖条件:
クロージャの欠点:
クロージャの役割:
閉鎖の原則: 関数の実行は、プリコンパイル段階と実行段階の 2 つの段階に分けることができます。
クロージャは主にスコープ チェーンの特性を利用します。関数内で定義された関数は、関数を含むアクティブ オブジェクトを自身のスコープ チェーンに追加します。関数が実行されると、その実行スコープ チェーンは破棄されますが、内部関数のスコープ チェーンは引き続きこのアクティブ オブジェクトを参照しているため、内部関数が破棄されるまでアクティブ オブジェクトは破棄されません。 クロージャ実装のデモ: // 1. 返された内部関数を介して関数内のローカル変数を操作する function fun () { var v = 100; // ローカル変数 // クロージャを完了するためにオブジェクトを返すことでローカル変数 v にアクセスします return { 設定: 関数 (x) { v = x; }, 取得: 関数 () { リターンv } } } var 結果 = fun(); 結果.set(200) console.log(result.get()); // 200 // 2. 関数が何回呼び出されたかをカウントするローカル変数を定義する var generate_count = function () { var コンテナ = 0; 関数を返す(){ コンテナ++ console.log(`これは ${container} 番目の呼び出しです`); } } var 結果 = generate_count(); result(); // これは最初の呼び出しです result(); // これは2番目の呼び出しです result(); // これは3番目の呼び出しです // 3. Math.pow() 関数を変更して、数値の平方または立方を求めるときに、2 番目のパラメータを毎回渡す必要がないようにします。/* Math.pow(4, 2) // 4の2乗 Math.pow(4, 3) // 4の3乗 */ // 関数ジェネレータ関数を記述する makePower (power) { 戻り値 (数値) => { Math.pow(数値、べき乗)を返す } } // 平方 let power2 = makePower(2) // 立方体 let power3 = makePower(3) // 4の2乗を計算する console.log(power2(4)) // 16 // 4の3乗を計算する console.log(power3(4)) // 62 要約: この記事では、JavaScript の 5 つの高階関数、つまり再帰、コールバック関数、自己調整関数、値関数、クロージャの使用と実装について説明します。 JS 高階関数に関するこの記事はこれで終わりです。JS 高階関数に関する関連記事をもっと知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: IEの送信フォームの記録履歴クリックリターン情報を実現するためのCSSスタイルコントロールはまだ残っています
>>: MySQL でシンプルな検索エンジンを実装するためのサンプルコード
Alibaba Cloud Server を使用している場合は、セキュリティ グループ設定でポート ...
序文フェイルオーバーが発生した後、よくある問題は同期エラーです。データベースが小さい場合は、ダンプし...
純粋なCSS3で蝶が羽ばたく様子を再現。まずはその効果をご覧ください どうですか?効果はかなりいいで...
序文Linux カーネルプログラミングでは、マクロ関数 container_of(ptr, type...
目次導入複数の異なるハッシュを区別するハッシュチャンクハッシュコンテンツハッシュjs キャッシュの実...
今日はdockerを使ってイメージをpullしたのですが、速度が悪くて見れず最後まで待ち続けました。...
目次基本的なHTML構造div とクラス名のショートカット キーを生成するクラス名を持つdiv ID...
目次背景実装のアイデア成果を達成する背景最近取り組んでいるプロジェクトは、Vue2 で構築されたプロ...
目次1. ブリッジを設定し、検証のためにパケットをキャプチャする1. ブリッジデバイスとセッションを...
CSS の適用範囲はグローバルです。プロジェクトがどんどん大きくなり、参加する人が増えるにつれて、命...
効果: GROUP_CONCAT関数は、フィールド値を文字列に連結することができます。デフォルトの区...
目次Tomcat クラスローダー階層WebAppクラスローダー共有クラスローダーカタリナクラスローダ...
簡略化されたファイル サイズを変更し、サンプルをダウンロードします。ファイルをローカル コンピュータ...
オーディオおよびビデオ ファイルを保存するためのディスク寿命を延ばすには、ディスクをフォーマットする...
目次1. 仮想DOMとは何ですか? 2. 仮想 DOM が必要な理由3. 仮想DOMはどのようにして...