成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文帶你搞懂JavaScript Currying(柯里化)函數(shù)

開發(fā) 前端
柯里化(Currying)是一種關(guān)于函數(shù)的高階技術(shù)。它不僅被用于 JavaScript,還被用于其他編程語言。

[[426293]]

大家好,我是進(jìn)階學(xué)習(xí)者。

一、什么柯里化(Currying)?

柯里化(Currying)是一種關(guān)于函數(shù)的高階技術(shù)。它不僅被用于 JavaScript,還被用于其他編程語言。

柯里化是一種函數(shù)的轉(zhuǎn)換,它是指將一個(gè)函數(shù)從可調(diào)用的 f(a, b, c) 轉(zhuǎn)換為可調(diào)用的 f(a)(b)(c)。柯里化不會(huì)調(diào)用函數(shù)。它只是對(duì)函數(shù)進(jìn)行轉(zhuǎn)換。

二、案例

例:

將創(chuàng)建一個(gè)輔助函數(shù) curry(f),該函數(shù)將對(duì)兩個(gè)參數(shù)的函數(shù) f 執(zhí)行柯里化。換句話說,對(duì)于兩個(gè)參數(shù)的函數(shù) f(a, b) 執(zhí)行 curry(f) 會(huì)將其轉(zhuǎn)換為以 f(a)(b) 形式運(yùn)行的函數(shù):

  1. function curry(f) {  // curry(f) 執(zhí)行柯里化轉(zhuǎn)換 
  2.   return function(a) { 
  3.     return function(b) { 
  4.       return f(a, b); 
  5.     }; 
  6.   }; 
  7. // 用法 
  8. function sum(a, b) { 
  9.   return a + b; 
  10. let curriedSum = curry(sum); 
  11. alert( curriedSum(1)(2) ); // 3 

運(yùn)行結(jié)果:

注:

正如所看到的,實(shí)現(xiàn)非常簡(jiǎn)單:只有兩個(gè)包裝器(wrapper)。

  • curry(func) 的結(jié)果就是一個(gè)包裝器 function(a)。
  • 當(dāng)它被像 curriedSum(1) 這樣調(diào)用時(shí),它的參數(shù)會(huì)被保存在詞法環(huán)境中,然后返回一個(gè)新的包裝器 function(b)。
  • 然后這個(gè)包裝器被以 2 為參數(shù)調(diào)用,并且,它將該調(diào)用傳遞給原始的 sum 函數(shù)。

三、目的是什么?它有什么好處?

例:

要了解,需要一個(gè)實(shí)際中的例子。

有一個(gè)用于格式化和輸出信息的日志(logging)函數(shù) log(date, importance, message)。在實(shí)際項(xiàng)目中,此類函數(shù)具有很多有用的功能,例如通過網(wǎng)絡(luò)發(fā)送日志(log),在這兒僅使用 alert:

  1. function log(date, importance, message) {  alert([${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}); 

讓將它柯里化!

  1. log = _.curry(log); 

柯里化之后,log 仍正常運(yùn)行:

  1. log(new Date(), "DEBUG""some debug"); // log(a, b, c) 

運(yùn)行結(jié)果:

……但是也可以以柯里化形式運(yùn)行:

  1. log(new Date())("DEBUG")("some debug"); // log(a)(b)(c) 

運(yùn)行結(jié)果:

現(xiàn)在,可以輕松地為當(dāng)前日志創(chuàng)建便捷函數(shù):

  1. // logNow 會(huì)是帶有固定第一個(gè)參數(shù)的日志的偏函數(shù) 
  2. let logNow = log(new Date());// 使用它 
  3.  
  4. logNow("INFO""message"); // [HH:mm] INFO message 

現(xiàn)在,logNow 是具有固定第一個(gè)參數(shù)的 log,換句話說,就是更簡(jiǎn)短的“偏應(yīng)用函數(shù)(partially applied function)”或“偏函數(shù)(partial)”。

可以更進(jìn)一步,為當(dāng)前的調(diào)試日志(debug log)提供便捷函數(shù):

  1. let debugNow = logNow("DEBUG"); 
  2. debugNow("message"); // [HH:mm] DEBUG message 

注:

柯里化之后,沒有丟失任何東西:log 依然可以被正常調(diào)用。

可以輕松地生成偏函數(shù),例如用于生成今天的日志的偏函數(shù)。

四、高級(jí)柯里化實(shí)現(xiàn)

下面是用于多參數(shù)函數(shù)的“高級(jí)”柯里化實(shí)現(xiàn),也可以把它用于上面的示例。

  1. function curry(func) {  
  2.   return function curried(...args) {     
  3.     if (args.length >= func.length) {       
  4.       return func.apply(this, args);    }  
  5.     else {      return function(...args2) {  
  6.       return curried.apply(this, args.concat(args2));       
  7.     }    
  8.          }  
  9.   }; 

例:

  1. function sum(a, b, c) {   
  2.   return a + b + c;} 
  3. let curriedSum = curry(sum); 
  4. alert( curriedSum(1, 2, 3) ); // 6,仍然可以被正常調(diào)用 
  5. alert( curriedSum(1)(2,3) ); // 6,對(duì)第一個(gè)參數(shù)的柯里化 
  6. alert( curriedSum(1)(2)(3) ); // 6,全柯里化 

運(yùn)行結(jié)果:

五、總結(jié)

本文基于JavaScript基礎(chǔ),介紹了Currying 函數(shù)。Currying 是一種轉(zhuǎn)換,將 f(a,b,c) 轉(zhuǎn)換為可以被以 f(a)(b)(c) 的形式進(jìn)行調(diào)用。

JavaScript 實(shí)現(xiàn)通常都保持該函數(shù)可以被正常調(diào)用,并且如果參數(shù)數(shù)量不足,則返回偏函數(shù)。Currying 函數(shù)讓能夠更容易地獲取偏函數(shù)。通過按案例的分析進(jìn)行詳細(xì)的講解。

代碼很簡(jiǎn)單,希望對(duì)你學(xué)習(xí)有幫助。

本文轉(zhuǎn)載自微信公眾號(hào)「前端進(jìn)階學(xué)習(xí)交流」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系前端進(jìn)階學(xué)習(xí)交流公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 前端進(jìn)階學(xué)習(xí)交流
相關(guān)推薦

2024-11-19 13:20:55

2021-09-07 09:46:40

JavaScriptGenerator函數(shù)

2020-12-03 08:23:23

函數(shù)柯里化代碼

2023-03-06 21:29:41

mmap技術(shù)操作系統(tǒng)

2019-08-06 09:00:00

JavaScript函數(shù)式編程前端

2022-08-15 15:39:23

JavaScript面向?qū)ο?/a>數(shù)據(jù)

2021-09-11 10:41:27

PythonPickle模塊

2021-09-27 07:39:52

Go初始化函數(shù)package

2021-11-06 10:18:30

Python變量常量

2021-08-05 06:54:05

觀察者訂閱設(shè)計(jì)

2021-12-01 11:40:14

Python 輸入輸出

2022-03-24 08:51:48

Redis互聯(lián)網(wǎng)NoSQL

2021-12-29 17:38:17

JavaScripttypeof前端

2024-04-12 12:19:08

語言模型AI

2021-10-14 10:25:05

JavaScript類型函數(shù)

2021-07-21 09:24:25

MongoDB數(shù)據(jù)庫(kù) Python

2020-09-23 16:07:52

JavaScript函數(shù)柯里化

2021-10-11 10:19:48

Javascript 高階函數(shù)前端

2021-03-22 10:05:59

netstat命令Linux

2023-09-15 12:00:01

API應(yīng)用程序接口
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 九九综合 | 欧美成人精品一区二区男人看 | 国产成人精品一区二区三区网站观看 | 亚洲综合一区二区三区 | 久久精品久久精品久久精品 | 亚洲人在线观看视频 | 99一级毛片 | 午夜无码国产理论在线 | 免费亚洲视频 | 成人高清在线视频 | 四虎国产| 国产精品九九视频 | 成人a免费 | 做a网站| 中文字幕日韩欧美 | 玖玖视频免费 | 欧美一区在线视频 | av黄在线观看 | 亚洲精品久久久一区二区三区 | 激情国产| 久久久久久看片 | 国产成年人小视频 | 一区二区播放 | 国产99久久 | 91久久精品一区二区二区 | 国产成人99久久亚洲综合精品 | 日韩精品人成在线播放 | 看片91| www久久久 | 羞羞的视频免费观看 | 成人午夜免费在线视频 | 蜜桃免费av| 国产精品揄拍一区二区 | 黄色香蕉视频在线观看 | 一级毛片在线播放 | 一区二区三区中文字幕 | 亚洲久在线 | 在线看日韩av | 日本在线精品视频 | 99精品久久 | 欧美日韩国产在线观看 |