javascript - 请问这个题怎么用js写呢?
高洛峰
高洛峰 2017-05-19 10:31:02
0
6
410


1.这里说得fn个参数,我知道应该跟arguments和在函数里面用return function(){}这种方式来写,但是就是写不明白

function add(a,b){
    return a+b;
}
function square(a){
    return a*a;
}
function plusOne(c){
    return c+1;
}
//var result = plusOne(square(add(1,2))); //这种的直接的转化成下面的不会
//alert(result);

var addSquareAndPlusOne = composite(add,square,plusOne);
function composite(add,square,plusOne){
    return function(){
      //这里怎么写呢?谢谢指导
    }
}
addSquareAndPlusOne(1,2);
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(6)
我想大声告诉你

第一种写法:

const composite = (...args) => {
    return (...arguments) => {
        return args.reduce((memo, current) => {
          return current(typeof memo === 'function' ? memo.apply(memo, arguments) : memo)
        })
    }
}

第二种写法:

const composite = (...args) => {
  return (...arguments) => {
    const init = args[0].apply(null, arguments)
    return args.slice(1).reduce((memo, current) => {
      return current(memo)
    }, init)
  }
}
洪涛

改进了一下 @小明 的代码,现在可以随意改变需要执行方法的顺序了,只需要保证有足够的参数就可以了

var composite = (...opts) => (...args)=>opts.reduce((curr, opt)=>[opt.apply(opt, curr), ...curr.slice(opt.length)], args)[0];

composite(add,square,plusOne)(1,2); // 10
composite(square,plusOne,add)(1,2); // 4
阿神

雷雷

小葫芦

通用一点的解,但是写的比较low...

function add(a,b){
    return a+b;
}
function square(a){
    return a*a;
}
function plusOne(c){
    return c+1;
}
// plusOne(square(add()))
var addSquareAndPlusOne = composite(add,square,plusOne);
function composite(){
    var slice = Array.prototype.slice,
        fns = slice.call(arguments),
        fnl = fns.length;

    if(fnl === 0) return null;

    return function () {
        var i = 1, ret = null;
        // console.log(fns,fnl)
        if(fnl > 2) {
            while(i < fnl) {
                // console.log(i)
                ret = i === 1 ? fns[i](fns[i - 1].apply(null, arguments)) : fns[i](ret);
                i++;
            }
            return ret;
        } else {
            return fns[0].apply(null, arguments);
        }
    }
}
addSquareAndPlusOne(1,2);
迷茫

我也来贴一个比较low的的写法,希望多多指正

var startParam=null;
  var o={
    f1:function (a,b){
      return (a+b);
    },
    f2:function (a,b){

      return (a-b);
    },
    f3:function (a,b){
      return (a*b);
    }
  };


function composite(fa,fb,fc){
  var args=arguments;
  for(var i=0;i<arguments.length;i++){
    if(i==0){
      (function(i){
        o['f'+(i+1)]=function(){
         return (startParam=args[i].apply(undefined,arguments));
      }})(i)
    }else{
      (function(i){
        o['f'+(i+1)]=function(){
         return (startParam=args[i].apply(undefined,[startParam].concat([].slice.call(arguments))));
      }})(i)
    }
  }
 
}
  composite(o.f1,o.f2,o.f3)
  alert(o.f1(1,1));
  alert(o.f2(3));
  alert(o.f3(4));
習慣沉默

把 @止水 同学的两种写法结合一下:

const composite = (...args) => {
    return (...arguments) => {
        return args.reduce((memo, current) => current.apply(current, [].concat(memo)), arguments)
    }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板