javascript - Bagaimana untuk menulis soalan ini dalam js?
高洛峰
高洛峰 2017-05-19 10:31:02
0
6
411
.
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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(6)
我想大声告诉你

Cara penulisan pertama:

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

Cara penulisan kedua:

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

Saya telah menambah baik kod @Xiaoming kini anda boleh menukar susunan kaedah untuk dilaksanakan sesuka hati

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
阿神
function composite(...args) {

    var fn = args[0];

    args = args.slice(1);

    return function() {
        
        var pr = fn.apply(this, arguments);

        return args.reduce((pre,cur)=>{
            return cur(pre)
        }
        , pr)
    }

}
小葫芦

Penyelesaian yang lebih umum, tetapi penulisannya agak rendah...

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);
迷茫

Saya juga akan siarkan kaedah penulisan yang agak rendah saya harap anda boleh membetulkan saya

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));
習慣沉默

Gabungkan dua kaedah penulisan @Zhishui:

const composite = (...args) => {
    return (...arguments) => {
        return args.reduce((memo, current) => current.apply(current, [].concat(memo)), arguments)
    }
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan