JS專題之函式柯里化

2021-09-26 03:09:54 字數 2250 閱讀 8245

前言

在電腦科學中,柯里化(英語:currying),又譯為卡瑞化或加里化,是把接受多個引數的函式變換成接受乙個單一引數(最初函式的第乙個引數)的函式,並且返回接受餘下的引數而且返回結果的新函式的技術。

一、為什麼會有函式柯里化?

currying 的重要意義在於可以把函式完全變成「接受乙個引數;返回乙個值」的固定形式,這樣對於討論和優化會更加方便。

將關注的重點聚焦到函式本身,而不因冗餘的資料引數分散注意力。

有這樣的說法,並非柯里化有什麼意義,而是,當函式可以作為函式的引數和返回值,成為函式式程式語言後,就會不可避免地產生函式柯里化。

二、具體實現

先來乙個簡單的 add 函式

function add(x, y) 

add(2, 3); // 5

複製**

重要的概念多說一遍:函式柯里化就是接收多個引數的函式變換為接收乙個函式,並返回接收餘下引數,最終能返回結果的技術 。

那麼,繼續:

function add(x) 

}add(2)(3); // 5

複製**

所以,曾經的乙個函式,因為閉包操作(返回函式並訪問了自由變數的行為),變成了多個接收乙個引數的函式。

所以簡單來講:函式柯里化就是意圖將函式的引數變成乙個。讓函式可以輸入乙個值,就返回乙個相對應的值,從而實現純函式化。

為什麼函式式程式設計要求函式必須是純的,不能有***?因為它是一種數**算,原始目的就是求值,不做其他事情,否則就無法滿足函式運算法則了。在函式式程式設計中,函式就是乙個管道(pipe)。這頭進去乙個值,那頭就會出來乙個新的值,沒有其他作用。

所以良好的程式設計規範是盡可能讓函式塊做乙個事情,實現可復用性,可維護性。

上面的例子中,如果有很多個引數怎麼辦,難道一層層巢狀?

我們繼續:

function plus(value) 

adder.tostring = function () )

}return adder;

}return add()(value);

}plus(2)(3)(5).tostring(); // 10;

複製**

上面的**看起來不那麼優雅,如果是減法,我們就得又重新為減法寫這麼多的**。像 lodash, underscore 這些工具庫,都提供了柯里化的工具函式。

我們一起來試著實現:

function curry(fn, args) 

else

}}複製**

三、應用場景

函式柯里化的好處有幾個:

引數復用;

提前返回;

延遲計算/執行。

函式柯里化允許和鼓勵你分隔複雜功能變成更小更容易分析的部分。這些小的邏輯單元顯然是更容易理解和測試的,然後你的應用就會變成乾淨而整潔的組合,由一些小單元組成的組合。

文章開篇的 add 函式,假如,每次呼叫加法有乙個初始值會怎樣?

var add = curry(function(a, b, c) )

var addten = add(10);

var addsix = add(6);

addten(2)(3); // 15;

addsix(7)(8); // 21;

複製**

以上**就實現了引數復用,儲存固定引數的函式。

看乙個經典的例子: 元素繫結事件***:

var addevent = function(el, type, fn, capture) , capture);

} else if (window.attachevent) );

} };複製**

以上**是為了相容 ie 瀏覽器對 dom 事件繫結做的函式封裝。

問題在於,每次對 dom 元素進行事件繫結時,函式內部都會走一遍 if else。那麼用函式柯里化就能實現提前返回

var addevent = (function(), (capture));

};} else if (window.attachevent) );};}

})();

複製**

總結

函式柯里化是「函式是一等公民」的程式語言環境形成的程式設計風格,利用了函式能作為引數一級返回值以及利用了閉包儲存變數的特點,是將多個引數的函式轉換為接收乙個引數,最後返回結果的技術。

js函式柯里化

什麼是函式柯里化?在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。這個技術由 christopher strachey 以邏輯學家 haskell curry 命名的,儘管它是 mos...

js 函式柯里化

函式柯里化的主要目的就是為了減少函式傳參,同時將一些固定引數私有化。下面展示一段非常簡單計算圓面積的 來說明函式柯里化的原理 circle函式,接受半徑r和 function circle r,p 通過函式柯里化來簡化circle函式,只傳入半徑就能計算出面積 不管怎麼樣,是不會變的,因此我們將他寫...

js 函式柯里化

函式柯里化的主要目的就是為了減少函式傳參,同時將一些固定引數私有化。下面展示一段非常簡單計算圓面積的 來說明函式柯里化的原理 circle函式,接受半徑r和 function circle r,p 通過函式柯里化來簡化circle函式,只傳入半徑就能計算出面積 不管怎麼樣,是不會變的,因此我們將他寫...