ホームページ ウェブフロントエンド jsチュートリアル JavaScript は高階関数 (高度なアプリケーション)_JavaScript スキル

JavaScript は高階関数 (高度なアプリケーション)_JavaScript スキル

May 16, 2016 pm 03:54 PM
高次関数

通常のプログラミング言語では、関数のパラメーターは基本型またはオブジェクト参照のみにすることができ、戻り値は基本データ型またはオブジェクト参照のみにすることができます。しかし、JavaScript では、関数は第一級市民であり、パラメーターとして渡したり、戻り値として返すことができます。いわゆる高階関数とは、関数をパラメータとして、または関数を戻り値として受け取ることができる関数です。この 2 つの状況には、実際の開発で多くの応用シナリオがあります。この記事は、私が仕事や勉強で遭遇したいくつかの応用シナリオをまとめたものです。

コールバック関数

コードの再利用は、アプリケーションを評価するための重要な基準の 1 つです。変更されたビジネスロジックを抽出してコールバック関数にカプセル化することで、コードの再利用率を効果的に向上させることができます。たとえば、ES5 で配列に追加された forEach メソッドは配列を走査し、各要素で同じ関数を呼び出します。

array = {};
array.forEach = function(arr, fn){
  for (var i = 0, len = arr.length; i < len; i++) {
    fn(arr[i], i, arr);
  }
}
ログイン後にコピー

毎回トラバーサル コードを再度記述する必要がなく、ビジネスの焦点をコールバック関数に集中させます。

部分関数

関数を戻り値として出力する応用例としては、部分関数です。いわゆる部分関数とは、パラメータまたは変数が事前に設定されている別の部分、つまり関数を呼び出す関数を作成する使用方法を指します。とにかく、定義を見ても、これが何のためにあるのかわかりません。まず例を見てみましょう。部分関数の最も典型的な例は型判定です。

JavaScript オブジェクトには、プロトタイプ属性、クラス属性、拡張性という 3 つの属性があります。 (知らない学生は、Rhino の本の 138 ページに戻って読んでください。) class 属性は文字列であり、JavaScript では直接提供されませんが、Object.prototype.toString を使用して間接的に取得できます。この関数は常に次の形式を返します:

[オブジェクトクラス]

それで、一連の isType 関数を書くことができます。

コードは次のとおりです:

isString = function(obj){
  return Object.prototype.toString.call(obj) === "[object String]";
}
isNumber = function(obj){
  return Object.prototype.toString.call(obj) === "[object Number]";
}
isArray = function(obj){
  return Object.prototype.toString.call(obj) === "[object Array]";
}
ログイン後にコピー

これらの関数のコードのほとんどは、現時点では、高階関数が豪華なデビューを果たしています:

isType = function(type) {
  return function(obj) {
    return Object.prototype.toString.call(obj) === "[object " + type + "]";
  }
}

isString = isType('String');
isNumber = isType('Number');
isArray = isType('Array');
ログイン後にコピー

したがって、いくつかのパラメータを指定して新しいカスタマイズされた関数を返す形式は部分関数です。

カレー作り

カリー化は部分評価とも呼ばれます。カリー化関数は、最初にいくつかのパラメータを受け入れます。これらのパラメータを受け入れた後、関数はすぐには評価されませんが、渡されたばかりのパラメータは関数によって形成されたクロージャに保存されます。関数が実際に評価されるときは、渡されたすべてのパラメーターが一度に評価に使用されます。

var currying = function(fn) {
  var args = [];
  
  return function() {
    if (arguments.length === 0) {
      return fn.applay(this, args);
    } else {
      args = args.concat(arguments);
      return arguments.callee;
    }
  }
}
ログイン後にコピー

例として、1 か月の毎日の出費を計算するとします。

var currying = function(fn) {
debugger;
  var args = [];
  
  return function() {
    if (arguments.length === 0) {
      return fn.apply(this, args);
    } else {
      Array.prototype.push.apply(args, arguments);
      return arguments.callee;
    }
  }
}

cost = function(){
  var sum = 0;
  for (var i = 0, len = arguments.length; i < len; i++) {
    sum += arguments[i];
  }
  
  return sum;
}
var cost = currying(cost);

cost(100);
cost(200);
alert(cost())
ログイン後にコピー

イベントスロットル

シナリオによっては、特定のイベントが繰り返しトリガーされる場合がありますが、イベント処理関数を毎回実行する必要はありません。たとえば、複雑な論理計算は window.resize イベントで実行されます。ユーザーがブラウザのサイズを頻繁に変更する場合、複雑な計算はパフォーマンスに重大な影響を与える可能性があり、サイズ変更が発生するたびにこれらの論理計算をトリガーする必要はありません。必要な計算は数回だけで済みます。現時点では、期間に基づいて一部のイベント リクエストを無視する必要があります。次のスロットル関数を見てください:

function throttle(fn, interval) {
   var doing = false;

   return function() {
    if (doing) {
     return;
    }
    doing = true;
    fn.apply(this, arguments);
    setTimeout(function() {
     doing = false;
    }, interval);
   }
  }
  
  window.onresize = throttle(function(){
    console.log('execute');
  }, 500);
ログイン後にコピー

関数の実行時間を制御することで、関数の実行数と機能要件の完璧なバランスを実現できます。もう 1 つのイベントは、mousemove です。このイベントを DOM 要素にバインドすると、マウスが要素上に移動するとイベントが繰り返しトリガーされます。

イベントは終了しました

頻繁にトリガーできる一部のイベントでは、イベント終了後に一連の操作を実行したい場合があります。現時点では、高階関数を使用して次の処理を行うことができます:

function debounce(fn, interval) {
  var timer = null;

 function delay() {
  var target = this;
  var args = arguments;
  return setTimeout(function(){
   fn.apply(target, args);
  }, interval);
 }

 return function() {
  if (timer) {
   clearTimeout(timer);
  }

  timer = delay.apply(this, arguments);
 }
};
window.onresize = throttle(function(){
  console.log('resize end');
}, 500);
ログイン後にコピー

このプロセス中にイベントがトリガーされた場合は、最後のイベント ハンドルをクリアし、実行時間を再バインドします。

参照:

《ノードの徹底解説》

「JavaScript の設計パターンと開発実践」

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPで関数型プログラミングを行う方法 PHPで関数型プログラミングを行う方法 Jun 06, 2023 am 08:21 AM

PHP は広く使用されているサーバーサイド言語であり、多くの Web 開発者が PHP の使用を好む理由の 1 つは、その豊富な関数ライブラリとシンプルで使いやすい関数構文です。関数型プログラミングは、データと動作を適切にカプセル化し、コードをよりモジュール化し、保守とテストを容易にするプログラミング パラダイムです。この記事では、PHPを使った関数型プログラミングの方法を紹介します。関数型プログラミングの基本 関数型プログラミングの中心的な考え方は、関数を第一級市民として扱うことです。関数自体は、変数のように渡したり、返したり、構成したりできます。

Python で高階関数を作成するにはどうすればよいですか? Python で高階関数を作成するにはどうすればよいですか? Sep 05, 2023 pm 07:29 PM

Python では、別の関数を引数として受け取る関数、または関数を出力として返す関数を高階関数と呼びます。その機能を見てみましょう - 関数は変数に格納できます。この関数はパラメータとして別の関数に渡すことができます。高階関数はリスト、ハッシュ テーブルなどの形式で保存できます。関数は関数から返すことができます。いくつかの例を見てみましょう - オブジェクトとしての関数 Example の中国語訳は次のとおりです。 Example この例では、これらの関数はオブジェクトとして扱われます。ここでは、関数demo()が変数に割り当てられています - #Creatingafunctiondefdemo(mystr):returnmystr.swapcase()#swappingthecase

PHP アロー関数: 高階関数へのネストされた呼び出しを処理する方法 PHP アロー関数: 高階関数へのネストされた呼び出しを処理する方法 Sep 13, 2023 am 08:27 AM

PHP アロー関数: 高階関数のネストされた呼び出しを処理する方法、具体的なコード例が必要 はじめに: PHP7.4 バージョンでは、アロー関数 (arrowfunction) の概念が導入されました。高階関数へのネストされた呼び出し。この記事では、アロー関数の基本的な使用法を紹介し、具体的なコード例を通じて高階関数の入れ子になった呼び出しを処理する方法を示します。 1. アロー関数とは何ですか?アロー関数は、PHP7.4バージョンで導入された新機能です。

Python の高階関数とは何ですか? Python の高階関数とは何ですか? Nov 10, 2023 pm 04:42 PM

高階関数には、map()、filter()、reduce()、lambda 関数、partial() などが含まれます。詳細な紹介: 1. map(): この組み込み関数は、関数と 1 つ以上の反復可能オブジェクトを入力として受け取り、入力関数を反復可能オブジェクトの各要素に適用する反復子を返します。 2. filter():この組み込み関数は、関数と反復可能なオブジェクトを入力として受け取り、入力関数が True などを返す要素を生成する反復子を返します。

Python の高階関数 Python の高階関数 Sep 13, 2023 pm 06:53 PM

Python の高階関数の世界の紹介 Python プログラミング スキルを向上させ、より表現力豊かで効率的なコードを生成したい場合は、ここが正しい場所です。 Python の関数は、単なる特殊なコード ブロックではありません。また、移動、転送、さらには動的に生成できる強力なものでもあります。高次関数は、他の関数を処理することでこの汎用性を高めます。この記事では、高階関数の原理について詳しく説明します。最高級のオブジェクトとしてのプロセスの基本を探り、高階関数の実際の例を詳しく調べ、明確で美しいコードを実現するラムダ関数の力を奨励します。関数型プログラミング モデルと、Python で使用する場合のその利点についても説明します。この記事を読むと、高階関数をしっかりと理解し、

Golang の関数型の高次関数を理解するにはどうすればよいですか? Golang の関数型の高次関数を理解するにはどうすればよいですか? Apr 20, 2024 am 11:54 AM

Golang の高階関数は関数を受け取り、関数を返します。これらは、関数をパラメーターとして受け取る、他の関数を処理する、または動的プログラムを実行するという 2 つのカテゴリに分類されます。関数を戻り値として返す: 保存して後で実行できる関数を作成して返します。

Golangにおける高階関数の応用シナリオの分析 Golangにおける高階関数の応用シナリオの分析 May 17, 2023 pm 05:40 PM

Golang 言語の人気と発展に伴い、関数型プログラミングのアイデアを使用しようとする開発者がますます増えています。 Golang の高階関数は関数型プログラミングに大きな利便性をもたらし、実際の開発で広く使用されています。では、Golang における高階関数の応用シナリオにはどのようなものがあるのでしょうか?次にこれを分析していきます。関数のパラメータと戻り値の処理 Golang では、関数を他の関数のパラメータや戻り値として使用できます。これは、関数をパラメータとして別の関数に渡すことができることを意味します。

Python の高階関数を理解するのに役立つ記事 Python の高階関数を理解するのに役立つ記事 Jul 25, 2023 pm 04:07 PM

高階関数とは Python では非常に便利な関数関数で、別の関数をパラメータとして受け取ることができる関数のことを高階関数と呼びます。

See all articles