一.定义
对传入函数的参数并不会立马进行求值,而是先将它们存储(利用闭包)起来,等到需要真正求值的时候一次性对之前传入的所有参数进行求值
二.实列
var add= (function () { var args = []; return function () { //通过函数的arguments属性判断该函数是否接受参数,如果没有参数,则计算args数组中的和 if (arguments.length === 0) { var result = 0; for (var i = 0, l = args.length; i < l; i++) { result += args[i]; } return result ; //如果有参数,则只能是将数据传到args数组中 } else { [].push.apply(args, arguments); } } })(); add(1) //不会求值,将其push到arguments中 add(2)//不会求值,将其push到arguments中 add()// 3 没有传入参数,进行求值
三.通用的柯里化函数
var currying = function (fn) { var args = []; return function () { if (arguments.length === 0) { return fn.apply(this, args); } else { [].push.apply(args, arguments); return arguments.callee; //指向当前调用函数的指针,此处指 currying } } };
四.应用
var add= (function () { var result = 0; return function () { //此处产生闭包,将值存储起来,不会销毁 for (var i = 0, l = arguments.length; i < l; i++) { result += arguments[i]; } return result ; } })(); var myAdd = currying(add); // 调用通用的柯里化函数转化成 currying 函 数 myAdd (1) //不会求值 myAdd (2) //不会求值 myAdd()//3 求值