函数柯里化经典题

78 阅读1分钟
 // 实现一个 add 方法 使输出结果能够满足如下预期
 add(1)(2)(3) = 6
 add(1,2,3)(4) = 10
 add(1)(2)(3)(4)(5) = 15
 
 function add(){
      // 第一次执行,定义一个数组专门用来存储所有的函数
     var _args = Array.prototype.slice.call(...arguments)
     
     // 在内部声明一个函数,利用闭包的特性保存 _args 并收集所有的参数值
     var _adder = function() {
         _args.push(...arguments);
         return _adder
     }
     // 利用 toString 隐式转换的特性,当最后执行时隐式转换,并计算最终值返回
     __adder.toString = function(){
            return _args.reduce(function(a,b){
                return a + b
            })
        }
        return adder
 }
 
add(1)(2)(3)
add(1,2,3)(4)
add(1)(2)(3)(4)(5)

Array.prototype.reduce()

reduce() 方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行), 将其结果汇总为单个返回值。

    const array1 = [1,2,3,4]
    const reducer = (accumulator,currentValue) => accumulator + currentValue
    
    // 1 + 2 + 3 + 4
    console.log(array1.reduce(reducer))
    // expected output: 10
    
    // 1 + 2 + 3 + 4 + 5
    console.log(array1.reduce(reducer,5))
    // expected output: 15
    

reducer 函数接收4个参数:

Accumulator (acc) (累计器)

Current Value (cur) (当前值)

Current Index (idx) (当前索引)

Source Array (src) (源数组)

Array.prototype.slice()

slice() 方法返回一个新的数组对象,这一对象是一个由 beginend 原数组的浅拷贝, (包括 begin 不包括 end) 原始数组不会变改变