首頁 web前端 js教程 Javascript 是你的高階函數(高階應用)_javascript技巧

Javascript 是你的高階函數(高階應用)_javascript技巧

May 16, 2016 pm 03:54 PM
高階函數

在通常的程式語言中,函數的參數只能是基本型別或物件引用,回傳值也只是基本資料型別或物件引用。但在Javascript中函數作為一等公民,既可以當做參數傳遞,也可以被當作回傳值傳回。所謂高階函數就是可以把函數當作參數,或是將函數當作傳回值的函數。這兩種情況在實際開發中有很多應用場景,本文是我在工作學習中遇到的幾個應用場景的總結。

  回呼函數

  程式碼重複使用是衡量一個應用程式的重要標準之一。透過將變化的業務邏輯抽離封裝在回呼函數中能夠有效的提高程式碼復用率。例如ES5中為數組增加的forEach方法,遍歷數組,對每個元素呼叫同一個函數。

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

透過回呼函數將業務的重點聚焦在回呼函數中,而不必每次都要重複編寫遍歷程式碼。

  偏函數

  作為將函數當做回傳值輸出的典型應用就是偏函數。所謂偏函數是指建立一個呼叫另一個部分——參數或變數已經預置的函數——的函數的用法。反正看著定義我是沒理解這東東幹嘛的。咱們還是先看例子吧,偏函數最典型的例子就是型別判斷。

  Javascript物件都擁有三個屬性:原型屬性、類別屬性、可擴充性。 (不知道的同學要回去翻犀牛書哦,page:138)類別屬性是一個字串,Javascript中並未直接提供,但我們可以利用Object.prototype.toString來間接得到。函數總是傳回如下形式:

[object Class]  

因此我們可以編寫一系列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');
登入後複製

 所以透過指定部分參數來傳回一個新的客製化函數的形式就是偏函數。

  currying(柯里化)

  currying又稱部分求值。一個currying的函數首先會接受一些參數,接受這些參數之後,函數並不會立即求值,而是繼續傳回另一個函數,剛才傳入的參數在函數形成的閉包中被保存。待到函數被真正需要求值的時候,之前傳入的所有參數都會被一次用來求值。

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);
登入後複製

如果在這過程中事件被觸發則清除上一次事件句柄,重新綁定執行時間。

參考資料:

《深入淺出node》

《Javascript設計模式與開發實務》

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用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

python高階函數有哪些 python高階函數有哪些 Nov 10, 2023 pm 04:42 PM

高階函數有map()、filter()、reduce()、lambda函數、partial()等。詳細介紹:1、map():這個內建函數接受一個函數和一個或多個可迭代物件作為輸入,然後傳回一個將輸入函數應用於可迭代物件的每個元素的迭代器;2、filter() :這個內建函數接受一個函數和一個可迭代物件作為輸入,然後傳回一個迭代器,該迭代器產生那些使得輸入函數傳回True的元素等等

PHP 箭頭函數:如何處理高階函數的巢狀調用 PHP 箭頭函數:如何處理高階函數的巢狀調用 Sep 13, 2023 am 08:27 AM

PHP箭頭函數:如何處理高階函數的巢狀調用,需要具體程式碼範例引言:在PHP7.4版本中,引入了箭頭函數(arrowfunctions)的概念,箭頭函數是一種簡潔的寫法,能夠優雅地處理高階函數的巢狀呼叫。本文將介紹箭頭函數的基本使用方法,並透過具體程式碼範例示範如何處理高階函數的巢狀呼叫。一、什麼是箭頭函數?箭頭函數是PHP7.4版本引入的新特性,它是一

Python中的高階函數 Python中的高階函數 Sep 13, 2023 pm 06:53 PM

簡介Python的高階函數世界如果您想提高Python程式設計能力並產生更具表現力和更有效的程式碼,那麼您來對地方了。 Python中的函數不僅僅是專門的程式碼區塊。它們也是可以移動、轉移、甚至是動態產生的強大東西。透過處理其他函數,高階函數增強了這種多功能性。本文將廣泛討論高階函數的原理。我們將探索作為一流物件的進程的基礎知識,深入研究高階函數的現實世界範例,並鼓勵lambda函數的功能以實現清晰而美觀的程式碼。也將討論函數式程式設計模型及其在Python中使用時的優點。讀完本文後,您將牢牢掌握高階函數,並且知道

Golang函數的高階函數應用場景分析 Golang函數的高階函數應用場景分析 May 17, 2023 pm 05:40 PM

隨著Golang語言的流行和發展,越來越多的開發者開始嘗試使用函數式程式設計的想法。 Golang中的高階函數為函數式程式設計帶來了很大的便利性,並且在實際開發中應用廣泛。那麼,Golang函數的高階函數應用場景是什麼呢?接下來,我們將對此進行分析。函數參數和傳回值的處理在Golang中,函數可以作為其他函數的參數或傳回函數。這就意味著我們可以將函數作為一個參數傳入另

如何理解 Golang 中函數型別的高階函數? 如何理解 Golang 中函數型別的高階函數? Apr 20, 2024 am 11:54 AM

Golang高階函數可接受和傳回函數。它們分成兩類:接收函數作為參數:處理其他函數或執行動態程式。傳回函數作為傳回值:建立和傳回可儲存和後期執行的函數。

一篇文章帶你了解Python高階函數 一篇文章帶你了解Python高階函數 Jul 25, 2023 pm 04:07 PM

高階函數是在Python中一個非常有用的功能函數,所謂高階函數就是一個函數可以用來接收另一個函數當參數,這樣的函數叫做高階函數。

See all articles