闭包的一个用途:函数柯里化(局部化)

概念

柯里化, Currying(局部化),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

用途

  1. 分步, 例如加法
function add(a, b) {
  return a + b
}
add(1, 2) // 3

function curryingAdd(a) {
  return function (b) {
    return a + b
  }
}
curryingAdd(1)(2) // 3

  1. 参数复用, 如正则匹配
function check(reg, text) {
  return reg.test(text)
}
check(/jj/, 'jj') // true
check(/jj/, 'tt') // false

//可以直接写为
function curringCheck(reg) {
  return function (text) {
    return reg.test(text)
  }
}
let checkFunc = curringCheck(/jj/)
checkFunc('jj') // true
checkFunc('js') // false

  1. 延迟运行
Function.prototype.bind = function () {
  var self = this // 保存原函数
  var context = [].shift.call(arguments) // 保存需要绑定的this上下文(第一个参数,就是传进来的函数)
  var args = [].slice.call(arguments) // 剩余的参数转为数组

  return function () {
    // 返回一个新函数
    // 合并参数
    var pars = [].concat.call(args, [].slice.call(arguments))
    self.apply(context, pars)
  }
}

window.a = 1
window.b = 2
function log() {
  console.log(this.a, this.b)
}
let k = log.bind(window)
k() // 1 2

像我们 js 中经常使用的 bind,实现的机制就是 Currying