看完这篇博客,你将了解

  • JS 函数的 this, arguments 是什么
  • JS 函数的 call, apply, bind 方法
  • 柯里化是什么?
  • 柯里化函数的套路

this & arguments

javascript中,每一个声明的函数都有 this 和 arguments 两个隐藏参数

记住以下规则,那么网上其他关于 this 的解释在此时都变得很啰嗦了

this 就是 call 的第一个参数!call 的其他参数组成的伪数组,统称为 arguments

call,apply, bind 方法

call/apply

通常调用函数 xx.fn(a, b)

  • 相当于 fn.call(xx, a, b,)
  • 相当于 fn.apply(xx, [a, b])

这就是 call 和 apply,两者的区别在于 arguments 是分开传入还是用数组传入

注意:arguments 与 apply 的第二参数 [a, b] 不同,前者是类似数组的对象,后者是数组

bind

调用 call 和 apply 的同时会直接调用函数,而调用 bind 不会,它是返回一个新函数,这个新函数会以 bind 的参数为 this

let fn = function() { console.log(this)}
let fn2 = fn.bind({name: 'simen'})

Function.prototype.bind = function(obj, arguments) {
    let self = this
    return function() {
        self.apply(obj, arguments)
    }
}

柯里化与高阶函数

柯里化就是把一个函数变成偏函数

高阶函数就是以函数为参数或返回函数的函数

把一个函数变成偏函数:比如将 f(x,y) 变成 f(x=1)(y) 或 f(y=1)x

//柯里化之前
function sum(x,y){
  return x+y
}
//柯里化之后
function addOne(y){
  return sum(1, y) //return 之后对应返回的形式,它是一个直接执行的函数语句
}
//柯里化之前
function Handlebar(template, data){
  return template.replace('{{name}}', data.name)
}
//柯里化之后
function Handlebar(template){
  return function(data){  //return 之后整个 function 对应返回的形式,它是一个单参函数
      return template.replace('{{name}}', data.name)
  }
}

//柯里化调用
var t = Handlebar('<p>my name is {{name}}</p>')
t({name: 'simen'})
t({name: 'chaos'})

柯里化可以将真实计算拖延到最后再做

柯里化的高级文章:

  1. http://www.yinwang.org/blog-cn/2013/04/02/currying
  2. https://zhuanlan.zhihu.com/p/31271179

高阶函数的概念:

在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:

  1. 接受一个或多个函数作为输入:forEach sort map filter reduce
  2. 输出一个函数:lodash.curry
  3. 不过它也可以同时满足两个条件:Function.prototype.bind

柯里化函数套路

这是柯里化一个函数的模板

function curry(fn) {
  return function () {           //函数需要参数的话也可以这里声明,里面拿
    let params = [...arguments]  //函数需要参数的话从这拿
    return fn.apply(undefined, params)
  }
}

return function() { return 目标返回类型}