iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
Modern Web

JavaScript 之路,往前邁進吧!系列 第 28

JS之路 Day28 - Currying (柯里化)

  • 分享至 

  • xImage
  •  

柯里化是一個函數的運用技術,不只是JavaScript裡面,它可以運用在很多的地方,簡單來說就是幫忙做了轉換。

原本的函式可能是長這樣的:

fnc(A,B,C);

柯里化後會變成這樣:

fnc(A)(B)(C);

這兩種方式最後出來的結果都是會一樣的,而怎麼實現的等等就會提到,
今天會從幾個角度介紹這個主題 =>

  • 介紹與原理
  • 目的與好處

介紹與原理

柯里化主要的用途是用來簡化呼叫函式的過程,像是說把呼叫f(a,b)變成呼叫f(a)以及f(b),
就可以達成說,把一個很多參數的函式,切分成很多只有一個參數的函式。

舉例來說:
這是一個簡單的相加,它是一個有很多參數的函式。

function plus(a, b, c) {
  return a + b + c;
 }

 console.log(plus(1, 2, 3)); //印出6

使用柯里化的方式改寫,讓它變成很多只有一個參數的函式。

function plus(a) {
  return function (b) {
    return function (c) {
      return a + b + c;
    };
  };
}

// 一次性的呼叫多個
console.log(plus(1)(2)(3)); //印出6

使用柯里化的方式後,可以一次性的呼叫多個,也可以讓最後只呼叫一個參數

function plus(a) {
  return function (b) {
    return function (c) {
      return a + b + c;
    };
  };
}
let plusThree = plus(1)(2);

//最後呼叫裡面只放一個參數
console.log(plusThree(3));//印出6

其實最主要的概念就是這樣而已,這邊要記得兩件事情

  • 柯里化不會去呼叫函式,只會對函式進行轉換
  • 柯里化一次只會接受一個參數

而柯里化其實是藉由把函式當作參數,帶到另一個參數之中,讓傳遞到的最後一個函式回傳之前所有的結果。

目的與好處

可以用來拆分程式碼,把比較重要的部分給保留,固定住一部分,只要改另外一部分就好,不用每次都全部寫出來。

比如說如果兩個數字需要相乘:

function multiply(a, b) {
    return a * b;
}

每次都需要填入兩個參數,但如果今天假如第一個數字是固定時,使用柯里化的方式就能夠,只填入一個參數達到相同的效果。

const multiply = (num) => {
  return (x) => {
    return num * x;
  };
};

const multiplyByTwo = multiply(10);

console.log(multiplyByTwo(1)); //10
console.log(multiplyByTwo(2)); //20
console.log(multiplyByTwo(3)); //30
console.log(multiplyByTwo(4)); //40
console.log(multiplyByTwo(5)); //50

不僅是減少重複的寫入,提高複用性,整體看起來的可讀性也會跟著上升。

同時也代表著不用在想著要傳入多少參數,一次就只要專心地傳遞一個,出現錯誤時可以更好的找出問題所在,那麼今天就介紹到這邊,明天見~

reference

[1] Currying - Wikipedia
[2] Currying
[3] Currying in JavaScript(柯里化)


上一篇
JS之路 Day27- JSON Methods(JSON 方法)
下一篇
JS之路 Day29 - Destructuring assignment(解構賦值)
系列文
JavaScript 之路,往前邁進吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
wizard03
iT邦新手 5 級 ‧ 2023-09-07 12:26:32

簡潔有力

我要留言

立即登入留言