JavaScript函式柯里化的作用

admin發表於2018-08-06

本章節介紹一下函式柯里化的作用,需要的朋友可以做一下參考。

關於柯里化的概念和實現可以參閱JavaScript函式柯里化詳解一章節。

下面就通過程式碼例項做一下介紹,廢話不多說,直接進入正題。

一.提高函式的適用性:

在某些時候我們追求通用性,但是通用性帶來的一個後果就是適用性減弱。

這是非常好理解的,比如你想學好所有的科學知識,那麼你很容易對所有的知識都不夠精通。

看下面的程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
function square(i) {
  return i * i;
}
function dubble(i) {
  return i *= 2;
}
function map(handeler, list) {
  return list.map(handeler);
}
// 陣列的每一項平方
map(square, [1, 2, 3, 4, 5]);
map(square, [6, 7, 8, 9, 10]);
map(square, [10, 20, 30, 40, 50]);
 
// 陣列的每一項加倍
map(dubble, [1, 2, 3, 4, 5]);
map(dubble, [6, 7, 8, 9, 10]);
map(dubble, [10, 20, 30, 40, 50]);

上面程式碼的通用性是沒有任何問題的,但是我們可以通過柯里化函式的方式進行以下優化。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼
function square(i){
  return i * i;
}
function dubble(i){
  return i *= 2;
}
 
function map(handeler,list){
  return list.map(handeler);
}
 
var curriedSquare = currying(map, square);
curriedFunc([1, 2, 3, 4, 5]);
curriedFunc([6, 7, 8, 9, 10]);
curriedFunc([10, 20, 30, 40, 50]);
 
var curriedDubble = currying(map, dubble);
curriedDubble([1, 2, 3, 4, 5]);
curriedDubble([6, 7, 8, 9, 10]);
curriedDubble([10, 20, 30, 40, 50]);

上面的程式碼中,函式經過柯里化之後,適用性明顯增強(當然犧牲的是通用性),但是可以讓呼叫方式簡便很多。

二.實現延遲執行:

這裡所謂的延遲執行就是不斷的累積引數,最後執行。

這個程式碼例項其實在講述柯里化實現的那文章中已經介紹,也可以參閱JavaScript函式無限級求和一章節。

三.固定易變因素:

柯里化可以提前把易變因素,傳參固定下來,生成一個更明確的應用函式。

最典型的代表應用,是bind函式用以固定this這個易變物件。

[JavaScript] 純文字檢視 複製程式碼
Function.prototype.bind = function (context) {
  var _this = this,
  _args = Array.prototype.slice.call(arguments, 1);
  return function () {
    return _this.apply(context, _args.concat(Array.prototype.slice.call(arguments)))
  }
}

其實也可以說是使用閉包實現了此功能,但是也有一定的柯里化特性。

內建的bind()方法可以參閱javascript bind()函式一章節。

相關文章