这是函数柯里化的一种基本表现形式
function add() { let args = [...arguments]; let fn = function () { args.push(...arguments); return fn; }; fn.toString = function () { // toString return args.reduce((t, v) => t + v); }; return fn; } alert(add(1, 2, 3)); alert(add(1)(2)(3));
函数的柯里化:curry(又叫部分求值) 把接受多个参数的函数变成接受一个参数的函数,并返回一个新的函数; 实现方法:用一个闭包,返回一个函数,这个函数每次执行都会改写储存参数的数组,当函数的参数够了之后,便会执行
ES5 实现
function curry(fn, args = []) { // 获取函数需要的参数长度 var length = fn.length; return function () { // 拼接得到现有的所有参数 for (let i = 0; i < arguments.length; i++) { args.push(arguments[i]); } // 判断参数的长度是否已经满足函数所需参数的长度 if (args.length >= length) { // 如果满足,执行函数 return fn.apply(this, args); } else { // 如果不满足,递归返回科里化的函数,等待参数的传入 return curry.call(this, fn, args); } }; } // test let add = curry((a, b, c) => a + b + c); // 一个一个测试 console.log(add(1)(2)(3)); console.log(add(1, 2)(3)); console.log(add(1)(2, 3));
ES6 实现
function curry(fn, ...args) { return fn.length <= args.length ? fn(...args) : curry.bind(null, fn, ...args); } // test let add = curry((a, b, c) => a + b + c); console.log(add(1)(2)(3)); console.log(add(1, 2)(3)); console.log(add(1)(2, 3));
本文作者:前端小毛
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!