js 你不知道的函數——偏函數


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 高階函數--偏函數的實現方法,希望對大家有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM