zoukankan      html  css  js  c++  java
  • js柯里化函数

     1 function sub_curry(fn) {
     2     var args = [].slice.call(arguments, 1); 
     3     return function() {
     4         return fn.apply(this, args.concat([].slice.call(arguments)));
     5     };
     6 }
     7 
     8 function curry(fn, length) {
     9     length = length || fn.length;
    10     return function() {
    11         if (arguments.length < length) {
    12             var combined = [fn].concat(Array.prototype.slice.call(arguments));
    13             return curry(sub_curry.apply(this, combined), length - arguments.length);
    14         } else {
    15             return fn.apply(this, arguments);
    16         }
    17     };
    18 }
    19 
    20 function add(a, b, c) {
    21     console.log(a + b + c);
    22 }
    23 
    24 curry(add)(1, 2, 3);
    25 curry(add)(1, 2)(3);
    26 curry(add)(1)(2, 3);
    27 curry(add)(1)(2)(3);

     注:

    (1)arguments是调用函数时传入的入参;

    (2)[].slice.call(arguments)同 Array.prototype.slice.call(arguments); 作用是把arguments转化为数组格式。

    (3)fn.length可以拿到函数的入参的长度

    简易版本:

     1 function add() {
     2     var args = Array.prototype.slice.call(arguments);
     3     var sub_add = function() {
     4         args.push(...arguments);
     5         // var chilsArgs = Array.prototype.slice.call(arguments);
     6         // args = args.concat(chilsArgs);
     7         return sub_add;
     8     }
     9     sub_add.toString = function() {
    10         return args.reduce((acc, val) => acc + val)
    11     }
    12     return sub_add;
    13 }
    14 
    15 add(1,2,3); //6
    16 add(1,2)(3); //6
    17 add(1)(2)(3); //6
  • 相关阅读:
    java7-4 继承的练习
    java7-3 继承
    cocos2d-x之计时器初试
    cocos2d-x之物理按键初试
    cocos2d-x之加速度传感器初试
    cocos2d-x之多点触碰初试
    cocos2d-x之事件传递
    cocos2d-x之单点触碰初试
    cocos2d-x之value
    cocos2d-x之Vector与map
  • 原文地址:https://www.cnblogs.com/vicky24k/p/11743331.html
Copyright © 2011-2022 走看看