call与apply反柯里化? 什么是柯里化与反柯里化?
纯函数
函数结果只受传入参数影响,参数一定,结果一定。
高阶函数
一个函数可以接收另一个函数作为参数,这种函数称为高阶函数。

function add (x,y,foo){
  return foo(x) + foo(y)
}
add(1,2,Math.abs) =>3

// es6写法

let add2 = (x,y,foo) => foo(x)+foo(y)
console.log(add2(-1,2,Math.abs)) =>3

柯里化(Currying)
接受一次性传入多个参数调用的函数,也可以传入部分参数调用,最后使它返回一个单一参数的函数去处理,并且返回。其中也可以传入函数作为参数,相当灵活。

let add =(a,b)=>a+b
console.log(add(1,2))
// 正常写法,需要传递两个参数给add
// add(1)=>NAN(缺少一个参数)
let add2 = a=>b=>a+b
console.log(add2(1)(2))
// 柯里化写法,将参数变换成一个,延迟函数参数的传入
// add2(1) => function(b) {return a+ b}

柯里化特点
延迟参数传递,参数复用
代码短小,优雅,函数化,有点不好理解
多重箭头函数与柯里化
ES5

let add = function(x){
  return function(y){
    return x+y
  }
}
console.log(add(2)(4)) =>6

箭头函数

let add = x => y =>x+y
console.log(add(2)(4))

函数作为参数

var add = function(x) {
  return function(y) {
    return x + y;
  }
}
console.log(add(1)(1)); //output 2
var add1 = add(1);
// try to compare this! add1, add1() and add1(1)
console.log(add1(1)); //output 2
var add10 = add(10);
console.log(add10(1)); //output 11

abbyhan
13 声望1 粉丝