javascript 链式函数运行

来源:互联网 发布:oppo手机数据自动打开 编辑:程序博客网 时间:2024/05/18 03:46

多个执行参函数

本文不讲解其中原理,只是作为笔记,记录代码,其中特性请自行百度:

编写一个add函数
add(2)(3)(4) //输出9

  • 方法一
function add(x) {    var sum = x;    var tmp = function (y) {        sum = sum + y;        return tmp;    };    tmp.toString = function () {        return sum;    };    return tmp;}console.log(add(1)(2)(3));  //6console.log(add(1)(2)(3)(4));   //10
  • 方法二
function add(num){    var sum=0;    sum= sum+num;    return function tempFun(numB){        if(arguments.length===0){            return sum;        }else{            sum= sum+ numB;            return tempFun;        }    }}

调用时和前面的有点区别

var result=add(2)(3)(4)(5)();console.log(result);//输出14
  • 方法三
function add(num){    var sum=0;    sum= sum+num;    var tempFun=function(numB){        if(arguments.length===0){            return sum;        }else{            sum= sum+ numB;            return tempFun;        }    }    tempFun.valueOf=function(){        return sum;    }    tempFun.toString=function(){        return sum+'';    }    return tempFun;}
var result=add(2)(3)(4)(5);console.log(+result);//输出14 valueOfconsole.log(result);//输出14 toString
  • 方法四
var add=(function(){    var args=[];    function addInner(){        if(arguments.length===0){            return calResult;        }else{            Array.prototype.push.apply(args,Array.prototype.splice.call(arguments,0));            return add;        }    }    function calResult(){        var result=args.reduce(function(previousValue, currentValue){            return previousValue+currentValue;        },0);        args=[];        return result;    }    addInner.valueOf=function(){        return calResult();    };    addInner.toString=function(){        return calResult()+'';    };    return addInner;}());console.log('%d',add(1)(2)(3)(4));
  • 方法五
    参数分多次传递这个操作叫curry.. 把curry和最后那个函数解耦的写法可以这样写
var curry = function(final, arity) {    var curried = function() {        // this是每次的参数列表        // 每次slice()保证curry后的函数仍然是无状态的        var new_args = this.slice();         for(arg_key in arguments) {            new_args.push(arguments[arg_key]);        }        if (new_args.length >= arity) {            return final.apply(null, new_args);        } else {            return curried.bind(new_args);        }    };    return curried.bind([]);};var sum4 = function(a,b,c,d) { return a+b+c+d; };var curried = curry(sum4, sum4.length);console.log(curried(1,2,3)(4));// -> 10console.log(curried(1)(2,3)(4));// -> 10
  • 方法六
function curry(fn) {    var slice = [].slice;    var len = fn.length;    return function curried() {        var args = slice.call(arguments);        if (args.length >= len) {            return fn.apply(null, args);        }        return function () {            return curried.apply(null, args.concat(slice.call(arguments)));        };    };}var add = curry(function (a, b, c, d) {    return a + b + c + d;});console.log(add(1)(2)(3)(4)); // 10console.log(add(1, 2, 3)(4)); // 10console.log(add(1)(2, 3)(4)); // 10
  • 方法七
function add(x) {    var sum = x;    var tmp = function (y) {        sum = sum + y;        return tmp;    };    tmp.toString = function () {        return sum;    };    return tmp;}console.log(add(1)(2)(3));  //6console.log(add(1)(2)(3)(4));   //10
  • 方法八
    最短,且没用任何中间变量
function add(n) {  var fn = function(m) {    return add(n + m);  };  fn.valueOf = function() {    return n;  };  fn.toString = function() {    return '' + n;  };  return fn;}

1 0
原创粉丝点击