博客 / 詳情

返回

柯里化函數

柯里化函數


標題 內容
柯里化 定義,特點,作用
柯里化實例 實現一個柯里化函數

定義

  • 柯里化(Curring)是把接受多個參數的函數變換成接受一個單一參數(這裏指最初函數的第一個參數)的函數,之前的多個參數剩下的參數怎麼處理了?
  • 剩餘的參數被放到了新的函數裏面,這個新的函數就是接受一個單一參數的函數返回的函數,整體理解如下:
  • 之前接受多個參數的函數function test(a, b) {}變成接受一個單一參數的函數,並且返回接受餘下的參數而且返回結果的新函數的技術。
function test(a, b) {
    return a * a + b * b;
}

// curring
function testCurring(a) {
    return function(b) {
        return a * a + b * b;
    }
}

特點

  • 我們剛剛説明清楚了柯里化定義,其實就是傳遞參數拆分開,但是返回函數這個特性是因為JavaScript閉包的存在,所以對於實現柯里化有天然的優勢。
  • 將多個參數拆分為一個一個參數的形式,我們細想一下發現拆分之後我們更加清晰了每一個函數的作用以及每一個參數的作用,這其實就是函數式編程的思想,從每一個函數和每一個參數出發去追述整體函數的作用,也就是局部入手去看全局,這也是柯里化的特點。
  • 但是,上面的實例只是特定的實例,有沒有通用的實例,我自己問自己,應該是有的,如下:
// 通用版
var curring = function(func) {
  var _args = [].slice.call(arguments, 1);
  return function() {
    args = _args.concat([].slice.call(arguments));
    func.apply(null, args);
  }
}

作用

  • 或者也可以説是好處,其實從特點中可以得到一個作用
    1. 在我們注意每一個參數的作用時,柯里化是我們的選擇(比如每個參數都是一樣的時候或者多個參數中有類似的參數的時候);
    1. 代碼需要更加清晰知道數據流向的時候(每一個參數的都可以追述);
    1. 參數之間有明顯的先後順序的時候(比如參數a就是比參數b在前面,就需要);

實例

 /**
|| =================================================================================
||
||     Filename: 1290-柯里化.js
||    Description:
||    Problem Description:
||
||        已知 fn 為一個預定義函數,實現函數 curryIt,調用之後滿足如下條件:
||        1、返回一個函數 a,a 的 length 屬性值為 1(即顯式聲明 a 接收一個參數)
||        2、調用 a 之後,返回一個函數 b, b 的 length 屬性值為 1
||        3、調用 b 之後,返回一個函數 c, c 的 length 屬性值為 1
||        4、調用 c 之後,返回的結果與調用 fn 的返回值一致
||        5、fn 的參數依次為函數 a, b, c 的調用參數 
||        輸入例子:
||        var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);
||
||        輸出例子:
||        6
||  Version:  1.0
||  
||       Created:   24/10/2016 09:53:32
||       Revision:  none
||       Compiler:  Firefox
||
||       Author:  Jack Dan9 (https://www.github.com/JackDan9), J.Dan92016@gmail.com 
||         AuthorBlog:http://my.csdn.net/XXJ19950917   
||
|| =====================================================================================
*/
// 柯里化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,
// 並且返回接受餘下的參數且返回結果的新函數的技術。
function curryIt(fn) {
    return function a(xa){
        return function b(xb){
            return function c(xc){
                return fn.call(this,xa,xb,xc);
            };
        };
    };
}

注意

  • 柯里化更多是數學當中的概念,方便函數拆分,一步一步求解得出整體的解,但是對於JavaScript來説它也是必不可少需要理解的特點。

Thinking in JackDan
1290-柯里化
Curring Video
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.