js 偏函數
在 js 函數中,有一種函數叫偏函數( 左傾 ),其原理是將一些函數組合封裝到一個函數中,調用時可以按順序實現全部功能。
1 function toUpperCase(str){ 2 return str.toUpperCase(); // 將字符串變成大寫 3 } 4 5 function add(str){ 6 return str + '!!!'; // 將字符串拼接 7 } 8 9 function split(str){ 10 return str.split(''); // 將字符串拆分為數組 11 } 12 13 function reverse(arr){ 14 return arr.reverse(); // 將數組逆序 15 } 16 17 function join(arr){ 18 return arr.join('-'); // 將數組按'-'拼接成字符串 19 } 20 21 function compose(){ 22 var args = Array.prototype.slice.call(arguments); // 類數組轉換為數組 23 var len = args.length - 1; // 最后一個參數的索引 24 return function(x){ 25 var result = args[len](x); // 執行最后一個函數的結果 26 while(len--){ 27 result = args[len](result); // 執行每個函數的結果 28 } 29 return result; 30 } 31 } 32 33 var f = compose(add, join, reverse, split, toUpperCase); 34 console.log( f('cba') ); // A-B-C!!!
在組合函數 compose 中,依次執行 toUpperCase、split、reverse、join、add 實現全部功能。接下來給出更優雅的寫法,通過數組自帶的方法實現。
1 function compose1(){ 2 var args = Array.prototype.slice.call(arguments); // 轉換為數組使用下面的方法 3 return function(x){ 4 return args.reduceRight(function(result, cb){ 5 return cb(result); 6 }, x); 7 } 8 } 9 10 var f = compose1(add, join, reverse, split, toUpperCase); 11 console.log( f('cba') ); // A-B-C!!!
最后用 ES6 的方法實現如下
1 const compose2 = (...args) => x => args.reduceRight((result, cb) => cb(res), x); 2 3 var f = compose2(add, join, reverse, split, toUpperCase); 4 console.log( f('cba') ); // A-B-C!!!
以上就是 js 高階函數--偏函數的實現方法,希望對大家有所幫助。