찾다
웹 프론트엔드JS 튜토리얼Javascript는 고차 기능(고급 응용 프로그램)_javascript 기술입니다.

일반적인 프로그래밍 언어에서 함수의 매개변수는 기본 유형 또는 객체 참조만 될 수 있으며, 반환 값은 기본 데이터 유형 또는 객체 참조만 될 수 있습니다. 그러나 Javascript에서 함수는 일급 시민이며 매개변수로 전달되거나 반환 값으로 반환될 수 있습니다. 소위 고차 함수(higher-order function)는 함수를 매개변수로 받거나 함수를 반환값으로 취할 수 있는 함수이다. 이 두 가지 상황에는 실제 개발에서 많은 응용 시나리오가 있습니다. 이 기사는 제가 직장과 연구에서 접한 몇 가지 응용 시나리오를 요약한 것입니다.

콜백 함수

코드 재사용은 애플리케이션을 측정하는 중요한 기준 중 하나입니다. 변경된 비즈니스 로직을 추출하여 콜백 함수에 캡슐화함으로써 코드 재사용률을 효과적으로 향상시킬 수 있습니다. 예를 들어, ES5의 배열에 추가된 forEach 메서드는 배열을 순회하고 각 요소에 대해 동일한 함수를 호출합니다.

array = {};
array.forEach = function(arr, fn){
  for (var i = 0, len = arr.length; i < len; i++) {
    fn(arr[i], i, arr);
  }
}

매번 순회 코드를 다시 작성할 필요 없이 콜백 함수에 비즈니스 초점을 맞춥니다.

 일부 기능

함수를 반환값으로 출력하는 대표적인 응용으로 부분함수(partial function)가 있습니다. 소위 부분 함수란 다른 부분, 즉 매개변수나 변수가 미리 설정된 함수를 호출하는 함수를 생성하는 사용법을 말합니다. 어쨌든, 정의를 보면 이게 무슨 용도인지 이해가 안 되네요. 먼저 예제를 살펴보겠습니다. 부분 함수의 가장 일반적인 예는 유형 판단입니다.

Javascript 객체에는 프로토타입 속성, 클래스 속성, 확장성이라는 세 가지 속성이 있습니다. (모르는 학생들은 Rhino 책 138페이지를 다시 읽어보세요.) 클래스 속성은 문자열이며 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;
    }
  }
}

한 달 동안의 일일 비용을 예로 들어 계산해 보겠습니다.

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 이벤트에서 복잡한 논리 계산이 수행됩니다. 사용자가 브라우저 크기를 자주 변경하면 복잡한 계산이 성능에 심각한 영향을 미칠 수 있습니다. 때로는 rezise가 발생할 때마다 이러한 논리 계산을 트리거할 필요가 없습니다. 제한된 계산만 필요합니다. 현재로서는 기간에 따른 일부 이벤트 요청을 무시해야 합니다. 다음 제한 기능을 살펴보세요.

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);

함수 실행 시간을 제어하면 함수 실행 횟수와 기능 요구 사항 간의 완벽한 균형을 이룰 수 있습니다. 또 다른 이벤트는 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 Hentai를 무료로 생성하십시오.

뜨거운 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음