JS函數柯里化(curry)

JS函數柯里化(curry)

函數柯里化,就是把一個多參數的函數,轉化爲單參數函數。
也就是說: 參數項可以分多次傳遞,直到參數滿足條件,函數執行

 		 function add(x, y) {
            return x + y;
        }

         add(1, 2) // 3

        // 柯里化
        function addX(y) {
            return function (x) {
                return x + y;
            };
        }

        addX(1)(2)  // 3    

柯力化應用
可以達到參數複用的效果

	function check(reg, txt) {
  	  return reg.test(txt)
	}
	// 每次需要傳遞正則, 不太方便
	check(/\d+/g, 'test')       //false
	check(/[a-z]+/g, 'test')    //true

	// Currying後  
	function curryCheck(reg) {
  	  return function(txt) {
   	     return reg.test(txt)
	    }
	}
	var hasNumber = curryCheck(/\d+/g)   
	var hasLetter = curryCheck(/[a-z]+/g) 

	hasNumber('test1')      // true
	hasLetter('testtest')   // true

如果要實現一個遞歸性質的

 	 function curry (fn, args) {
            var limit = fn.length;  // 被柯里化函數 的參數量
            args = args || []; //   原始參數,沒有傳空數組
            return function () {
                // 獲取函數調用時傳遞的參數
                var _args = Array.prototype.slice.call(arguments);
                args = args.concat(_args); // 合併參數
                if (args.length < limit) { // 如果參數長度未達到,再次返回一個函數
                    return curry(fn, args)
                }
                return fn.apply(null, args) // 參數滿足,執行結果
            }
        }
        var curryAdd = curry(add);
        curryAdd(3)(2);  //5 
     

參考:

https://www.jianshu.com/p/2975c25e4d71

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章