javascript curry

    xiaoxiao2021-12-13  22

    curring又称为部分求值,一个curring的函数,会首先接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另一个函数,刚才传入的参数在函数形成的闭包中被保存起来,待到函数真正需要求值的时候,之前传入的所有参数都会被一次性用于求值 。

    何时使用curry

    当发现正在调用同一个函数,并且传递的参数绝大多数都是相同的,那么该函数可能是用于curry化的一个很好的候选参数。可以通过将一个函数集合部分应用到函数中,从而动态创建一个新函数。


    curry化函数的示例1

    //柯里化函数 function curring(fn){ var slice = Array.prototype.slice, stored_args = slice.call(arguments, 1);//截取函数之后的所有参数 return function() { var new_args = slice.call(arguments), args = stored_args.concat(new_args);//合并数组 return fn.apply(null, args);//传null的时候,this对象为windows }; } //普通函数 function add(a, b, c, d, e){ return a + b + c + d + e; } //可运行于任意数量的参数 curring(add,1, 2, 3)(5, 5);//16 //两步curry化 var addone = curring(add, 1); addOne(10, 10, 10, 10);//41 var addSix = curring(addOne, 2, 3); addSix(5, 5);//16

    《Javascript patterns》 Page87

    示例2

    var curring = function(fn){ var args = []; return function(){ if(arguments.length === 0){ return fn.apply(this,args); }else{ [].push.apply(args,arguments); return arguments.callee; } } } //求值函数 var cost = (function(){ var money = 0; return function(){ for(var i= 0;i < arguments.length;i++){ money += arguments[i]; } return money; } })(); var cost1 = curring(cost); cost1(100);//未真正求值 cost1(200);//未真正求值 cost1(300);//未真正求值 alert(cost1());//真正求值600

    Javascript设计模式与开发实践 page50

    转载请注明原文地址: https://ju.6miu.com/read-950274.html

    最新回复(0)