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

通常のプログラミング言語では、関数のパラメーターは基本型またはオブジェクト参照のみにすることができ、戻り値は基本データ型またはオブジェクト参照のみにすることができます。しかし、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 までご連絡ください。
如何使用PHP进行函数式编程如何使用PHP进行函数式编程Jun 06, 2023 am 08:21 AM

PHP是一种广泛使用的服务器端语言,许多Web开发人员喜欢使用PHP的原因之一是它丰富的函数库和简单易用的函数语法。而函数式编程则是一种程序设计范式,它良好地封装数据和行为,使得代码更加模块化,易于维护和测试。在这篇文章中,我们将介绍如何使用PHP进行函数式编程。函数式编程基础函数式编程的核心思想是将函数视为一等公民,函数本身可以像变量一样被传递、返回和组合

如何在Python中创建高阶函数?如何在Python中创建高阶函数?Sep 05, 2023 pm 07:29 PM

在Python中,将另一个函数作为参数或将函数作为输出返回的函数被称为高阶函数。让我们来看看其特性-该函数可以存储在变量中。该函数可以作为参数传递给另一个函数。高阶函数可以以列表、哈希表等形式存储函数可以从函数中返回。让我们来看一些例子−函数作为对象Example的中文翻译为:示例在这个例子中,这些函数被视为对象。在这里,函数demo()被赋值给一个变量-#Creatingafunctiondefdemo(mystr):returnmystr.swapcase()#swappingthecase

PHP 箭头函数:如何处理高阶函数的嵌套调用PHP 箭头函数:如何处理高阶函数的嵌套调用Sep 13, 2023 am 08:27 AM

PHP箭头函数:如何处理高阶函数的嵌套调用,需要具体代码示例引言:在PHP7.4版本中,引入了箭头函数(arrowfunctions)的概念,箭头函数是一种简洁的写法,能够优雅地处理高阶函数的嵌套调用。本文将介绍箭头函数的基本使用方法,并通过具体代码示例演示如何处理高阶函数的嵌套调用。一、什么是箭头函数?箭头函数是PHP7.4版本引入的新特性,它是一

python高阶函数有哪些python高阶函数有哪些Nov 10, 2023 pm 04:42 PM

高阶函数有map()、filter()、reduce()、lambda函数、partial()等。详细介绍:1、map():这个内置函数接受一个函数和一个或多个可迭代对象作为输入,然后返回一个将输入函数应用于可迭代对象的每个元素的迭代器;2、filter():这个内置函数接受一个函数和一个可迭代对象作为输入,然后返回一个迭代器,该迭代器产生那些使得输入函数返回True的元素等等

在Python中的高阶函数在Python中的高阶函数Sep 13, 2023 pm 06:53 PM

简介Python的高阶函数世界如果您想提高Python编程能力并生成更具表现力和更有效的代码,那么您来对地方了。Python中的函数不仅仅是专门的代码块。它们也是可以移动、转移、甚至动态生成的强大东西。通过处理其他函数,高阶函数增强了这种多功能性。本文将广泛讨论高阶函数的原理。我们将探索作为一流对象的进程的基础知识,深入研究高阶函数的现实世界示例,并鼓励lambda函数的功能以实现清晰而美观的代码。还将讨论函数式编程模型及其在Python中使用时的优点。读完本文后,您将牢牢掌握高阶函数,并且知道

如何理解 Golang 中函数类型的高阶函数?如何理解 Golang 中函数类型的高阶函数?Apr 20, 2024 am 11:54 AM

Golang高阶函数可接受和返回函数。它们分两类:接收函数作为参数:处理其他函数或执行动态程序。返回函数作为返回值:创建和返回可存储和后期执行的函数。

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

ホット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ヘンタイを無料で生成します。

ホットツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません